首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSOutputStream发布到url

使用NSOutputStream发布到url
EN

Stack Overflow用户
提问于 2012-06-26 22:11:36
回答 2查看 4.5K关注 0票数 2

所以我想做的就是向一个url发送一个POST请求。现在,我尝试使用NSURLRequest/NSURLConnection,但遇到了问题,决定转到一个较低的级别,这也是因为我想发送大文件,并且认为直接处理流可能更好。但是输出流委托似乎从未被调用过,而且我似乎找不到使用NSOutputStream的initWithURL的示例。

代码语言:javascript
复制
NSURL *url = [NSURL URLWithString:NSString stringWithFormat: @"http://url"];
self.outputStream = [[NSOutputStream alloc] initWithURL:url append:NO];
[outputStream retain];
[outputStream setDelegate:self];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream open];

初始化后的outputStream似乎是空的,我无法理解这一点,因为我的url是一个有效的url--我可以从终端对其执行ping操作,然后从其他来源发送数据。我做错了什么吗,或者有人能告诉我如何使用streams编写对URL的POST请求?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 22:36:18

不能使用NSOutputStream向HTTP服务器发送POST请求。

好的方法是创建一个NSMutableURLRequest并为该请求提供一个HTTPBodyStream,然后创建一个NSURLConnection来发送该请求。

HTTPBodyStream是请求将从其中读取正文的NSInputStream。您可以使用NSData对象或文件内容对其进行初始化。

如果您希望提供自定义内容(例如,您希望将文件作为multipart/form-data请求的一部分上传),则可能需要将NSInputStream子类化。在这种情况下,我建议您研究一下How to implement CoreFoundation toll-free bridged NSInputStream subclass,它解释了如何解决在NSURLConnection中使用自定义输入流时出现的问题。或者你可以使用ASIHTTPRequest,它提供开箱即用的多部分超文本传输协议请求。

票数 3
EN

Stack Overflow用户

发布于 2020-04-16 19:49:45

可以,您可以使用NSOutputStream发送HTTP GET/POST请求。

1.创建并打开您的流。

2.当流准备好写入时,将在方法中发送NSStreamEventHasSpaceAvailable事件:

代码语言:javascript
复制
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode

https://developer.apple.com/documentation/foundation/nsstreamdelegate/1410079-stream?language=objc

3.创建一个CFHTTPMessageRef &并写入数据。

代码如下:

代码语言:javascript
复制
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
    switch (eventCode) {
    case NSStreamEventOpenCompleted:{
        // 
    }
        break;
    case NSStreamEventHasSpaceAvailable:{
        [self sendHTTPMessage];
    }
        break;
    default:{
        //
    }
        break;
}

- (void)sendHTTPMessage{
    //create a http GET message
    CFStringRef requestMethod = (CFStringRef)CFAutorelease(CFSTR("GET"));
    CFHTTPMessageRef httpRequest = (CFHTTPMessageRef)CFAutorelease(CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, (__bridge  CFURLRef)yourURL,kCFHTTPVersion1_1));
    //set HTTP header
    CFHTTPMessageSetHeaderFieldValue(httpRequest, (__bridge CFStringRef)@"Host", (__bridge CFStringRef)@"yourhost.com");
    CFHTTPMessageSetHeaderFieldValue(httpRequest, (__bridge CFStringRef)@"Connection", (__bridge CFStringRef)@"close");
    //set HTTP Body
    ...
    //let's send it
    CFDataRef serializedRequest = CFHTTPMessageCopySerializedMessage(httpRequest);
    NSData *requestData = (__bridge_transfer NSData *)serializedRequest;
    [self.outStream write:requestData.bytes maxLength:requestData.length];
    [self.outStream close];
}

请记住,关键点是将CFHTTPMessageRef转换为字节以进行写入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11209249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档