所以我想做的就是向网址发送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,我无法理解,因为我的url是一个有效的url - 我可以从终端ping它并从其他来源发送数据。我做错了什么,或者有人能告诉我如何使用流向URL写一个POST请求吗?感谢。
答案 0 :(得分:3)
您无法使用NSOutputStream
向HTTP服务器发送POST请求。
好方法是创建NSMutableURLRequest
并使用HTTPBodyStream
提供该请求,然后创建NSURLConnection
以发送请求。
HTTPBodyStream
是NSInputStream
请求将从中读取正文。您可以使用NSData
对象或文件内容对其进行初始化。
如果要提供自定义内容(例如,您希望将文件作为multipart/form-data
请求的一部分上传),则可能需要继承NSInputStream
。在这种情况下,我建议您查看How to implement CoreFoundation toll-free bridged NSInputStream subclass,其中介绍了如何解决使用NSURLConnection
自定义输入流时出现的问题。或者您可以使用提供开箱即用的多部分HTTP请求的ASIHTTPRequest。
答案 1 :(得分: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转换为要写入的字节。