首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >allHeaderFields在查找键时不区分大小写。

allHeaderFields在查找键时不区分大小写。
EN

Stack Overflow用户
提问于 2017-06-02 09:03:16
回答 3查看 1.1K关注 0票数 5

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

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

但是,正如文档中对allHeaderFields说的那样:

var allHeaderFields: AnyHashable :任意{ get } 包含作为服务器响应一部分而接收的所有HTTP头字段的字典。通过检查此字典,客户端可以看到HTTP服务器返回的“原始”标头信息。 本词典中的键是从服务器接收到的标题字段名。有关常用HTTP报头字段的列表,请参见RFC 2616。 HTTP标头不区分大小写。为了简化代码,某些标头字段名被规范化为它们的标准形式。例如,如果服务器发送内容长度标头,则自动调整为内容长度。 返回的标题字典被配置为在set操作期间保持大小写(除非键已经以不同的大小写存在),并且在查找键时不区分大小写。 例如,如果您设置标头X,然后设置报头X,则字典的键将是X,但是值将从X头中获取。

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

代码语言:javascript
复制
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"])")
}

在我的控制台里

代码语言:javascript
复制
Access-Token: nil
access-token: Optional(jdRtDzKHNs_i-jt3Lh3a3A)
access-token: nil

我漏掉了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-13 03:19:53

这个虫子和阿拉莫火没有关系。这是斯威夫特的窃听器。

不幸的是,这是一个已知的错误,出现在Swift 3,当他们把标题转换成字典时。该病毒自2016年起注册,至今仍未解决。更糟糕的是,他们甚至没有更正Swift文档。

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

Stephen做了一个解决方案

错误报告

票数 4
EN

Stack Overflow用户

发布于 2022-03-14 17:34:06

所有条件下的后续扩展工作。因为NSDictionary将避免转换为swfit字典,并保留不区分大小写的字典。

代码语言:javascript
复制
extension HTTPURLResponse {
    /// get value for caseless header field
    public final func headerString(field: String) -> String? {
        return (self.allHeaderFields as NSDictionary)[field] as? String
    }
}

有趣的是,当使用可选类型时,这个无单元的特性就消失了。

因此,以下所有工作:

代码语言:javascript
复制
(self.allHeaderFields as NSDictionary)["Access-Token"]
(self.allHeaderFields as NSDictionary)["access-token"]
(self.allHeaderFields as NSDictionary)["aCCESS-toKEN"]

但以下不起作用:

代码语言:javascript
复制
(self.allHeaderFields as? NSDictionary)?["aCCESS-toKEN"]
票数 1
EN

Stack Overflow用户

发布于 2022-02-10 15:37:09

Apple最终提供了一种方法,在Swift中对HTTP头进行不区分大小写的查找。我们应该呼吁:

代码语言:javascript
复制
HTTPURLResponse.value(forHTTPHeaderField:)

而不是使用allHeaderFields。您可以找到这个信息这里 (这是爱德华多在他的答案中提供的bug报告链接)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44324874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档