如何使用带有NSString的setHTTPBody方法作为参数?

时间:2014-03-27 07:25:27

标签: ios objective-c nsurlconnection nsjsonserialization nsmutableurlrequest

我必须使用Web服务,它采用HTTP Body格式,如下所示

{
  "ScreenID" : "screenID1",
  "DeviceID" : "E7EF8DCE-CE8A-4F0C-BBC5-F080C29FEF29",
  "SessionStartTime" : "2014-03-27T06:50:15",
  "SessionEndTime" : "2014-03-27T06:50:15"
}

现在我使用NSMutableURLRequest实例 它需要NSData实例作为参数

代码如下: -

NSMutableURLRequest *request = [[NSMutableRequest alloc] initWithURL:@"someurl"]
[request setHTTPMethod:@"POST"];

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[request setValue:cipher forHTTPHeaderField:@"Cipher"];

NSData *jsonData;
if ([NSJSONSerialization isValidJSONObject:dict]) {
    NSError *error;
    jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
    if (!jsonData) {

        NSLog(@"json Data %@",error.description);

    } else {

        NSString *JSONString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding];

        NSLog(@"JSON String %@",JSONString);//[JSONString dataUsingEncoding:NSUTF8StringEncoding]
        [request setHTTPBody:jsonData];

    }

}
else
{
    NSLog(@"This Data can't be serialized");

}
//NSLog(@"URL Request %@",[request allHTTPHeaderFields]);
NSLog(@"jsonDATA %@",jsonData);

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    if (connectionError) {
        //NSLog(@"Error %@",connectionError.description);
    }else
    {
        NSLog(@"%@",response);
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"data str %@",str);

    }
}];

JSONstring的内容是==

{
  "ScreenID" : "screenID1",
  "DeviceID" : "E7EF8DCE-CE8A-4F0C-BBC5-F080C29FEF29",
  "SessionStartTime" : "2014-03-27T06:50:15",
  "SessionEndTime" : "2014-03-27T06:50:15"
}

jsonDATA的内容是==

<7b0a2020 22536372 65656e49 4422203a 20224c61 6e64696e 67506167 65564322 2c0a2020 22446576 69636549 4422203a 20224537 45463844 43452d43 4538412d 34463043 2d424243 352d4630 38304332 39464546 3239222c 0a202022 53657373 696f6e53 74617274 54696d65 22203a20 22323031 342d3033 2d323754 30373a31 343a3336 222c0a20 20225365 7373696f 6e456e64 54696d65 22203a20 22323031 342d3033 2d323754 30373a31 343a3336 220a7d>

我的问题: -

因为我的webservice中的HTTPBody格式不支持

生成的格式
[request setHTTPBody:jsonData];

然而,如果我可以使用

那就没关系
[request setHTTPBody:JSONstring];

但是

NSString参数无法与setHTTPBody方法一起使用 我该怎么办 ? 有替代解决方案吗?

1 个答案:

答案 0 :(得分:3)

将JSON字符串编码为要设置为正文数据的数据是正确的做法。它不会改变格式或任何字符串内容(您的数据日志在这种形式中并不构成任何意义)。

当数据到达服务器时,它将用作字符串,这是一个带有一组键/值对的JSON格式字符串。这是预期的行为。

如果您的服务器没有正确处理JSON,那么您可能会遇到请求中设置的标头或JSON包含的键/值的问题。