Send POST request using NSURLSession Send POST request using NSURLSession objective-c objective-c

Send POST request using NSURLSession


You could try using a NSDictionary for the params. The following will send the parameters correctly to a JSON server.

NSError *error;NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];NSURL *url = [NSURL URLWithString:@"[JSON SERVER"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy                                                   timeoutInterval:60.0];[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];[request setHTTPMethod:@"POST"];NSDictionary *mapData = [[NSDictionary alloc] initWithObjectsAndKeys: @"TEST IOS", @"name",                     @"IOS TYPE", @"typemap",                     nil];NSData *postData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error];[request setHTTPBody:postData];NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {}];[postDataTask resume];

Hope this helps (I'm trying to sort a CSRF authenticity issue with the above - but it does send the params in the NSDictionary).


Motivation

Sometimes I have been getting some errors when you want to pass httpBody serialized to Data from Dictionary, which on most cases is due to the wrong encoding or malformed data due to non NSCoding conforming objects in the Dictionary.

Solution

Depending on your requirements one easy solution would be to create a String instead of Dictionary and convert it to Data. You have the code samples below written on Objective-C and Swift 3.0.

Objective-C

// Create the URLSession on the default configurationNSURLSessionConfiguration *defaultSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultSessionConfiguration];// Setup the request with URLNSURL *url = [NSURL URLWithString:@"yourURL"];NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];// Convert POST string parameters to data using UTF8 EncodingNSString *postParams = @"api_key=APIKEY&email=example@example.com&password=password";NSData *postData = [postParams dataUsingEncoding:NSUTF8StringEncoding];// Convert POST string parameters to data using UTF8 Encoding[urlRequest setHTTPMethod:@"POST"];[urlRequest setHTTPBody:postData];// Create dataTaskNSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {    // Handle your response here}];// Fire the request[dataTask resume];

Swift

// Create the URLSession on the default configurationlet defaultSessionConfiguration = URLSessionConfiguration.defaultlet defaultSession = URLSession(configuration: defaultSessionConfiguration)// Setup the request with URLlet url = URL(string: "yourURL")var urlRequest = URLRequest(url: url!)  // Note: This is a demo, that's why I use implicitly unwrapped optional// Convert POST string parameters to data using UTF8 Encodinglet postParams = "api_key=APIKEY&email=example@example.com&password=password"let postData = postParams.data(using: .utf8)// Set the httpMethod and assign httpBodyurlRequest.httpMethod = "POST"urlRequest.httpBody = postData// Create dataTasklet dataTask = defaultSession.dataTask(with: urlRequest) { (data, response, error) in    // Handle your response here}// Fire the requestdataTask.resume()


You can use https://github.com/mxcl/OMGHTTPURLRQ

id config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:someID];id session = [NSURLSession sessionWithConfiguration:config delegate:someObject delegateQueue:[NSOperationQueue new]];OMGMultipartFormData *multipartFormData = [OMGMultipartFormData new];[multipartFormData addFile:data1 parameterName:@"file1" filename:@"myimage1.png" contentType:@"image/png"];NSURLRequest *rq = [OMGHTTPURLRQ POST:url:multipartFormData];id path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"upload.NSData"];[rq.HTTPBody writeToFile:path atomically:YES];[[session uploadTaskWithRequest:rq fromFile:[NSURL fileURLWithPath:path]] resume];