iOS 8.3更新后NSMutableURLRequest正文格式错误

Bar*_*més 15 post json objective-c ios

在今天的iOS 8.3更新之前,我的代码工作正常,但在更新服务器后开始拒绝请求,因为它无法找到JSON数据.

我发现iOS发送了一个错误的应用程序/ x-www-form-urlencoded文本(没有正确编码,因为它似乎是一个JSON对象):

Wireshark屏幕截图显示错误的数据

这是我期望发送的内容(以及8.2发送的内容): Wireshark屏幕截图显示了预期的对象

正如我所说的,这只发生在iOS 8.3上(我刚刚在iOS模拟器上尝试过8.2并且它可以工作).

我认为问题出现在这些行中的一个类中:

NSData *bodyData = [NSJSONSerialization dataWithJSONObject:requestDict options:0 error:nil];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPBody = bodyData;
Run Code Online (Sandbox Code Playgroud)

我检查了Apple文档,最近没有出现任何修改.

有人遭受同样的痛苦或知道是什么导致这种情况?

谢谢.

Ruf*_*fel 11

我也在一个应用程序中遇到过这个问题.

看起来它可能是iOS 8.3中引入的错误.从官方的框架参考资料中可以看出它NSURLSessionConfigurationHTTPAdditionalHeaders财产:

此属性指定基于此配置添加到会话中的所有任务的其他标头.例如,您可以设置User-Agent标头,以便它自动包含在您的应用根据此配置通过会话进行的每个请求中.

根据我的理解,此配置中的Content-Type集应自动包含在通过此会话发出的每个请求中,自8.3以来不再是这种情况.我已经提交了雷达.

更新:雷达被设置为另一个的"重复",所以它更可能是一个错误.

正如Luca所指出的,解决方法是直接在请求上设置Content-Type:

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
Run Code Online (Sandbox Code Playgroud)

资料来源: https ://developer.apple.com/library/mac/documentation/Foundation/Reference/NSURLSessionConfiguration_class/#//apple_ref/occ/instp/NSURLSessionConfiguration/HTTPAdditionalHeaders

  • 随着iOS 8.3的发布而受到关注 - 在每个url请求上设置Content-Type而不是使用`NSURLSessionConfiguration`修复问题 (2认同)

Luc*_*aco 7

我把评论作为答案在这里:

尝试指出http方法

[request setHTTPMethod:@"POST"]
Run Code Online (Sandbox Code Playgroud)

和/或请求长度

[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
Run Code Online (Sandbox Code Playgroud)

和/或内容类型

[request setValue:@"application/<YOUR CONTENT TYPE>"forHTTPHeaderField:@"Content-Type"];
Run Code Online (Sandbox Code Playgroud)