我正在使用Alamofire进行API调用。
根据我使用的服务器,响应头可以大写。
但是,正如文档中对allHeaderFields说的那样:
var allHeaderFields: AnyHashable :任意{ get } 包含作为服务器响应一部分而接收的所有HTTP头字段的字典。通过检查此字典,客户端可以看到HTTP服务器返回的“原始”标头信息。 本词典中的键是从服务器接收到的标题字段名。有关常用HTTP报头字段的列表,请参见RFC 2616。 HTTP标头不区分大小写。为了简化代码,某些标头字段名被规范化为它们的标准形式。例如,如果服务器发送内容长度标头,则自动调整为内容长度。 返回的标题字典被配置为在set操作期间保持大小写(除非键已经以不同的大小写存在),并且在查找键时不区分大小写。 例如,如果您设置标头X,然后设置报头X,则字典的键将是X,但是值将从X头中获取。
但在我的代码中,如果我这样做:
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我漏掉了什么吗?
发布于 2017-08-13 03:19:53
这个虫子和阿拉莫火没有关系。这是斯威夫特的窃听器。
不幸的是,这是一个已知的错误,出现在Swift 3,当他们把标题转换成字典时。该病毒自2016年起注册,至今仍未解决。更糟糕的是,他们甚至没有更正Swift文档。
这违反了HTTP规范,我不知道为什么他们只将其标记为中等优先级。似乎他们不在乎,也永远不会解决这个问题。
Stephen做了一个解决方案
发布于 2022-03-14 17:34:06
所有条件下的后续扩展工作。因为NSDictionary将避免转换为swfit字典,并保留不区分大小写的字典。
extension HTTPURLResponse {
/// get value for caseless header field
public final func headerString(field: String) -> String? {
return (self.allHeaderFields as NSDictionary)[field] as? String
}
}有趣的是,当使用可选类型时,这个无单元的特性就消失了。
因此,以下所有工作:
(self.allHeaderFields as NSDictionary)["Access-Token"]
(self.allHeaderFields as NSDictionary)["access-token"]
(self.allHeaderFields as NSDictionary)["aCCESS-toKEN"]但以下不起作用:
(self.allHeaderFields as? NSDictionary)?["aCCESS-toKEN"]发布于 2022-02-10 15:37:09
Apple最终提供了一种方法,在Swift中对HTTP头进行不区分大小写的查找。我们应该呼吁:
HTTPURLResponse.value(forHTTPHeaderField:)而不是使用allHeaderFields。您可以找到这个信息这里 (这是爱德华多在他的答案中提供的bug报告链接)。
https://stackoverflow.com/questions/44324874
复制相似问题