Set NSDictionary to HTTPBody and submit using the POST method

I want to call a web service using the POST method. I need to host a dictionary with a url. The parameters of my web service are listed below:

 ConversationMessage { authorUserId (string, optional), subject (string, optional), hasAttachment (boolean, optional), conversationId (string, optional), attachment (DigitalAsset, optional), content (string, optional), title (string, optional), urgency (boolean, optional), searchable (Map[String,Object], optional) } DigitalAsset { id (string, optional), assetUrl (string, optional), assetContent (string, optional), thumbGenerated (boolean, optional), fileName (string, optional) } Map[String,Object] { empty (boolean, optional) } 

Below is my request:

  NSMutableArray *arr=[[NSMutableArray alloc]init]; NSMutableDictionary *dict=[[NSMutableDictionary alloc]init]; [dict setValue:@"test title" forKey:@"title"]; [dict setValue:@"test message" forKey:@"content"]; [dict setValue:@"0" forKey:@"urgency"]; [arr addObject:[NSMutableDictionary dictionaryWithObject:dict forKey:@"ConversationMessage"]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ; [request setURL:[NSURL URLWithString:strUrl]]; [request setTimeoutInterval:10.0]; [request setHTTPMethod:strMethod]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *body=[[NSMutableData alloc]init]; for (NSMutableDictionary *dict in array) { NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL]; [body appendData:jsonData]; } [request setHTTPBody:body]; 

But I get the following error:

The server refused this request because the request object is in a format not supported by the requested resource for the requested method

+6
source share
5 answers

Please find the code below that sends data to the web service. Please note that this is a sample that I used in one of my applications.

 //json format to send the data jsondata = [NSJSONSerialization dataWithJSONObject:"NSDictionary variable name" options:NSJSONWritingPrettyPrinted error:&error]; NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:theUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:120.0]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-type"]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [request setHTTPMethod:@"POST"]; [request setValue:[NSString stringWithFormat:@"%d", [jsondata length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:jsondata]; 

Hope this helps.

From your comments, โ€œthe server refused this requestโ€ whether the server supports JSON or XML format.

+7
source

Try the following code:

 NSString *params = [self makeParamtersString:dictData withEncoding:NSUTF8StringEncoding]; NSData *body = [params dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:body]; [request setHTTPMethod:@"POST"]; - (NSString*)makeParamtersString:(NSDictionary*)parameters withEncoding:(NSStringEncoding)encoding { if (nil == parameters || [parameters count] == 0) return nil; NSMutableString* stringOfParamters = [[NSMutableString alloc] init]; NSEnumerator *keyEnumerator = [parameters keyEnumerator]; id key = nil; while ((key = [keyEnumerator nextObject])) { NSString *value = [[parameters valueForKey:key] isKindOfClass:[NSString class]] ? [parameters valueForKey:key] : [[parameters valueForKey:key] stringValue]; [stringOfParamters appendFormat:@"%@=%@&", [self URLEscaped:key withEncoding:encoding], [self URLEscaped:value withEncoding:encoding]]; } // Delete last character of '&' NSRange lastCharRange = {[stringOfParamters length] - 1, 1}; [stringOfParamters deleteCharactersInRange:lastCharRange]; return stringOfParamters; } - (NSString *)URLEscaped:(NSString *)strIn withEncoding:(NSStringEncoding)encoding { CFStringRef escaped = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)strIn, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", CFStringConvertNSStringEncodingToEncoding(encoding)); NSString *strOut = [NSString stringWithString:(__bridge NSString *)escaped]; CFRelease(escaped); return strOut; } 
+2
source

Can you try to form the following format?

 NSString *parameter = [NSString stringWithFormat:@"title=testtitle&content=testmessage&urgency=0"]; NSData *parameterData = [parameter dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

And then set it like a body

 [theRequest setHTTPBody:parameterData]; 
+1
source

NSMutableURLRequest has a setHTTPBody: method that takes your NSData* jsonData as a parameter. On a surface that seems to be your problem. You never call it in the code above.

0
source

I hope you use a stream to transfer a multi-page file.

To pass parameters, you should use something like this before passing multi-page data:

 NSString *contentDisposition = @"Content-Disposition: form-data; name=\"<name of the parameter with double quotes>\""; NSString *contentType = @"Content-Type: application/json; charset=UTF-8"; 

Scroll through all the options and add contentDisposition and contentType separated by a border line.

Here's what the format looks like:

 -----------------------------14737809831466499882746641449 Content-Disposition: form-data; name="title" Content-Type: application/json; charset=UTF-8 test title -----------------------------14737809831466499882746641449 Content-Disposition: form-data; name="content" Content-Type: application/json; charset=UTF-8 test message -----------------------------14737809831466499882746641449 Content-Disposition: form-data; name=multipartFile; filename="<fileName>" Content-Type: text/plain 

Convert this line to NSData and add the multi-page data of your file and set HTTPBody.

Hope this helps.

0
source

All Articles