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 aHTTPBodyStream
then create aNSURLConnection
to send the request.The
HTTPBodyStream
is anNSInputStream
the request will read the body from. You may initialize it with aNSData
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 subclassNSInputStream
. 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 withNSURLConnection
. Or you may use ASIHTTPRequest which provides multipart HTTP requests out of the box.