So all I want to do is send a POST request to a url. Now I tried using NSURLRequest/NSURLConnection, but was having problems with that and decided to move to a lower level, also because I want to send large files and thought dealing directly with streams might be better. But the output stream delegate never seems to be called, and I can't seem to find examples using NSOutputStream's 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];
It seems that the outputStream is null after the init, which I can't understand because my url is a valid url--I can ping it from the terminal and send data from other sources. Am I doing something wrong, or can anyone tell me how to write a POST request to a URL using streams? Thanks.
You cannot use NSOutputStream
to send a POST request to a HTTP server.
The good method is to create a NSMutableURLRequest
and provide that request with a HTTPBodyStream
then create a NSURLConnection
to send the request.
The HTTPBodyStream
is an NSInputStream
the request will read the body from. You may initialize it with a NSData
object or with the contents of a file.
If you want to provide a custom content (for example, you want to upload a file as part of a multipart/form-data
request), you may need to subclass NSInputStream
. In such case, I suggest you to have a look at How to implement CoreFoundation toll-free bridged NSInputStream subclass, which explains how to address an issue that occurs when using custom input streams with NSURLConnection
. Or you may use ASIHTTPRequest which provides multipart HTTP requests out of the box.