查找键时,allHeaderFields不区分大小写

时间:2017-06-02 09:03:17

标签: swift header alamofire

我正在使用Alamofire进行API调用。

根据我使用的服务器,响应头可以大写。

但正如文档所说的allHeaderFields:

  

var allHeaderFields:[AnyHashable:Any] {get}

     

包含作为服务器响应的一部分接收的所有HTTP标头字段的字典。通过检查此字典,客户端可以看到HTTP服务器返回的“原始”标头信息。

     

此字典中的键是从服务器收到的标题字段名称。有关常用HTTP标头字段的列表,请参阅RFC 2616。

     

HTTP标头不区分大小写。为了简化代码,某些标题字段名称被规范化为其标准格式。例如,如果服务器发送内容长度标题,则会自动将其调整为Content-Length。

     

返回的标题字典配置为在设置操作期间保留大小写(除非密钥已存在且具有不同的大小写),并且在查找键时不区分大小写。

     

例如,如果设置标题X-foo,然后设置标题X-Foo,则字典的键将为X-foo,但该值将取自X-Foo标题。

但是在我的代码中,如果我这样做:

if let headers = response.response?.allHeaderFields {
   print("Access-Token: \(response.response?.allHeaderFields["Access-Token"])")
   print("access-token: \(response.response?.allHeaderFields["access-token"])")
   print("access-token: \(response.response?.allHeaderFields["Access-token"])")
}

在控制台中我有

Access-Token: nil
access-token: Optional(jdRtDzKHNs_i-jt3Lh3a3A)
access-token: nil

我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

该错误与Alamofire无关。这是一个Swift bug。

不幸的是,当Swift 3将标题转换为Dictionary时,这是一个已知的错误。该错误自2016年开始注册,仍未解决。为了使事情变得更糟,他们甚至没有纠正Swift文档。

这违反了HTTP规范,我不知道为什么他们只将此标记为中等优先级。似乎他们不关心,永远不会解决这个问题。

A workaround was made by Stephen Gurnett

Bug Report