allHeaderFields 查找键时不区分大小写

Tan*_*tti 5 header swift alamofire

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

\n

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

\n

但正如 allHeaderFields 的文档所述:

\n
\n

var allHeaderFields: [AnyHashable: 任意] { get }

\n

包含作为 server\xe2\x80\x99s 响应一部分接收到的所有 HTTP 标头字段的字典。通过检查此字典,客户端可以看到 HTTP 服务器返回的 \xe2\x80\x9craw\xe2\x80\x9d 标头信息。

\n

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

\n

HTTP 标头不区分大小写。为了简化代码,某些标头字段名称被规范化为其标准形式。例如,如果服务器发送一个Content-Length标头,它会自动调整为Content-Length。

\n

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

\n

例如,如果您设置标头 X-foo,然后再设置标头 X-Foo,则字典\xe2\x80\x99s 键将为 X-foo,但值将从 X-Foo 标头获取。

\n
\n

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

\n
if let headers = response.response?.allHeaderFields {\n   print("Access-Token: \\(response.response?.allHeaderFields["Access-Token"])")\n   print("access-token: \\(response.response?.allHeaderFields["access-token"])")\n   print("access-token: \\(response.response?.allHeaderFields["Access-token"])")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在控制台我有

\n
Access-Token: nil\naccess-token: Optional(jdRtDzKHNs_i-jt3Lh3a3A)\naccess-token: nil\n
Run Code Online (Sandbox Code Playgroud)\n

我错过了什么吗?

\n

Edu*_*tal 4

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

不幸的是,这是 Swift 3 将标头转换为字典时出现的一个已知错误。该错误自 2016 年以来就已被记录,但仍未解决。更糟糕的是,他们甚至没有更正 Swift 文档。

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

Stephen Gurnett 提出了一个解决方法

错误报告