URLSession 配置的标头设置仅适用于 PUT,不适用于 POST

Posted

技术标签:

【中文标题】URLSession 配置的标头设置仅适用于 PUT,不适用于 POST【英文标题】:URLSession configuration's header setting only work for PUT, not for POST 【发布时间】:2015-04-09 10:48:09 【问题描述】:

我正在使用以下代码使用 NSURLSession 默认会话

  var defaultSession : NSURLSession 
    var config = NSURLSessionConfiguration.defaultSessionConfiguration()
    config.HTTPAdditionalHeaders = [
      // FIXME: for POST this line doesn't work, but for PUT it works, this could be a bug.
      "Content-Type": "application/json"
    ]
    return NSURLSession(configuration: config, delegate: self.delegate, delegateQueue: NSOperationQueue.mainQueue())
  

但似乎 content-type: application/json 设置仅适用于 PUT 方法,这是服务器响应

POST application/x-www-form-urlencoded /api/v2/DevHiin 400 24.815 ms - 11
PUT application/json /api/v2/DevBoost 201 51.151 ms - 65

当我为每个 POST 请求添加标头设置时,它再次起作用。

        req.addValue("application/json", forHTTPHeaderField: "Content-Type")

服务器

POST application/json /api/v2/DevHiin 201 19.925 ms - 95
PUT application/json /api/v2/DevBoost 201 23.729 ms - 65

但这真的不是一个漂亮的解决方案,整个代码真的很奇怪,有没有人有洞察力告诉我发生了什么?

非常感谢!

【问题讨论】:

【参考方案1】:

ios 8.3 似乎在 NSURLSessionConfiguration 中引入了一个错误,导致指定的 Content-Type 不被接受(有关类似问题,请参阅 NSMutableURLRequest body malformed after iOS 8.3 update)。这使我们的整个应用程序陷入瘫痪,直到我们实施了后端解决方法。正如您所描述的,我们还将 Content-Type 添加到每个可变 POST 请求中。

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

【讨论】:

一个问题,如果您有另一个进程将 Content-Type 标头添加到同一个可变请求对象,那么使用 addValue 会将标头连接到类似“application/json,application/json ”。因此,最好使用 [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];如果它不存在,这将添加标题,如果存在则更新它。

以上是关于URLSession 配置的标头设置仅适用于 PUT,不适用于 POST的主要内容,如果未能解决你的问题,请参考以下文章

PHP 标头未使用 litespeed 设置(但适用于 apache)

Swagger 仅适用于 apicontroller,不适用于 mvc 控制器?

标头位置不适用于实时服务器,但适用于 localhost

密码屏蔽仅适用于 JDBC 连接器

Collectstatic仅适用于某些应用

URLSession 下载任务委托仅在所有任务完成后调用