Set an NSDictionary in HTTPBody and send using POST method

Sunny Shah picture Sunny Shah · Feb 26, 2014 · Viewed 18.6k times · Source

I want to call a web service with the POST method. I need to post a dictionary with a URL. My web service parameters are given 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)
}

Following 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 am getting the following error:

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

Answer

user2071152 picture user2071152 · Feb 26, 2014

Please find the below code which POST the data to a webservice. Please note this is a sample which i used in one of my application.

//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 "server refused this request" does the server support JSON or XML format.