【问题标题】:NSMutableURLRequest body malformed after iOS 8.3 updateiOS 8.3 更新后 NSMutableURLRequest 正文格式错误
【发布时间】:2015-06-14 05:11:42
【问题描述】:

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

我发现 iOS 发送了错误的 application/x-www-form-urlencoded 文本(未正确编码,因为它似乎是 JSON 对象):

这是我期望发送的(以及在 8.2 上发送的):

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

我认为问题出在以下几行中的一个类中:

NSData *bodyData = [NSJSONSerialization dataWithJSONObject:requestDict options:0 error:nil];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPBody = bodyData;

我检查了 Apple 文档,但没有显示为最近修改过的。

是否有人遭受同样的痛苦或知道会导致这种情况的原因?

谢谢。

【问题讨论】:

  • 尽量标明http方法如[request setHTTPMethod:@"POST"],最终,请求长度[request setValue:postLength forHTTPHeaderField:@"Content-Length"];和内容类型[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"];
  • 它可以将Content-Type 标头与"application/json" 值放在一起。似乎我将标题添加到NSURLSessionConfiguration 而不是NSMutableURLRequest。谢谢!。
  • 我将作为答案,以便我们可以关闭此问题
  • openradar.appspot.com/20489846 在这个问题上看起来像个雷达; QuickRadar 如果您想提交副本,那么复制雷达非常容易。
  • @LucaIaco 很抱歉重新提出一个老问题,但为什么是Current-Type 而不是Content-Type?我最近在我接管的代码库中看到了它,但找不到任何表明它做什么的东西?这两者是相似的吗?

标签: ios objective-c json post


【解决方案1】:

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

看起来这可能是 iOS 8.3 中引入的错误。来自官方的Framework Reference,据说NSURLSessionConfigurationHTTPAdditionalHeaders属性:

此属性指定添加到基于此配置的会话中的所有任务的附加标头。例如,您可以设置 User-Agent 标头,使其自动包含在您的应用通过基于此配置的会话发出的每个请求中。

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

更新:雷达已被设置为另一个雷达的“重复”,因此它更可能是一个错误。

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

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

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

【讨论】:

  • 文档还声明请求对象上的标头优先于配置上的标头。这里的含义是NSMutableURLRequest 现在设置了Content-Type,而不是以前。
  • 刚刚发布 iOS 8.3 时遇到了这个问题 - 在每个 url 请求上设置 Content-Type 而不是使用 NSURLSessionConfiguration 解决了这个问题
  • 感谢您的解决方法。在具有多天应用程序审查时间框架的平台中,这是一个可怕的错误。我想知道有多少应用程序因此而在生产中被破坏。
【解决方案2】:

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

尽量标明http方法如

[request setHTTPMethod:@"POST"]

和/或,请求长度

[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

和/或内容类型

[request setValue:@"application/<YOUR CONTENT TYPE>"forHTTPHeaderField:@"Content-Type"];

【讨论】:

  • 太棒了。在某些实现中,这可能是一种快速的方法:NSDictionary *headers = session.configuration.HTTPAdditionalHeaders; for (id key in headers.allKeys) { [request addValue:[headers objectForKey:key] forHTTPHeaderField:key]; }
【解决方案3】:

iOS 8.3 似乎引入了这一点。在我的站点上,我们发现请求中未正确设置 (json)body 的问题。

调试时也尝试调试服务器端

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多