通过将 JSON 的数据表示作为 HTTP 主体,我已成功地将 JSON 用作我的应用程序中的 POST Web 服务的参数:
//Prep
NSData *requestData = [NSJSONSerialization dataWithJSONObject:<my JSON> options:0 error:nil];
NSString *apiString = <the webservice>;
//POST
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:apiString]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:requestData];
//Go
NSURLResponse *response = nil;
queryResultData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
效果很好。
问题是,这适用于期望单个 JSON 参数作为 http 正文的 web 服务。
如何将 JSON 作为众多参数之一包含在内,您可以使用 @"arg1=val1&arg2=val2" 的数据编码方式。
例如:图像你有一个期望像这样的网络服务
http://mysite.com/api/v1/route/test?data={json:%22true%22}&other=abcdefg
必须作为 POST 提交。
有趣的是,这有一个 JSON 字典作为许多参数中的一个,而不是在正文中。我不知道如何将这些论点添加到帖子中。
编辑
这是 php 中的相同概念。你如何在 Cocoa 中做到这一点?
$data = array('x' => 1, 'name => 'fred');
$json = json_encode($data);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, array('json_data' => $json));
-- or --
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, 'something=whatever&json_data='.$json);