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