使用NSOutputStream POST到url

问题描述 投票:2回答:2

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

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];

似乎init之后outputStream为null,我无法理解,因为我的网址是有效的网址-我可以从终端ping它并从其他来源发送数据。我是在做错什么,还是有人可以告诉我如何使用流将POST请求写入URL?谢谢。

cocoa post nsoutputstream
2个回答
3
投票

您不能使用NSOutputStream将POST请求发送到HTTP服务器。

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

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

[如果要提供自定义内容(例如,要作为multipart/form-data请求的一部分上载文件),则可能需要继承NSInputStream。在这种情况下,建议您看看How to implement CoreFoundation toll-free bridged NSInputStream subclass,它说明了如何解决在NSURLConnection中使用自定义输入流时出现的问题。或者,您可以使用ASIHTTPRequest开箱即用地提供多部分HTTP请求。


0
投票

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

1.make&打开您的流。

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

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode

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

3。制作CFHTTPMessageRef&并写入数据。

这样的代码:

- (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转换为要写入的字节。

© www.soinside.com 2019 - 2024. All rights reserved.