Mar*_*ges 11 http case-insensitive ios nshttpurlresponse swift3
转换为Swift 3我注意到从HTTPURLResponse读取头字段时出现了一个奇怪的错误.
let id = httpResponse.allHeaderFields["eTag"] as? String
Run Code Online (Sandbox Code Playgroud)
不再工作了.
我打印出所有标题字典,我的所有标题键似乎都在Sentence案例中.
根据查尔斯代理,我的所有标题都是小写的.根据后端团队的说法,在他们的代码中,标题是Title-Case.根据文档:标题应该不区分大小写.
所以我不知道该相信哪一个.是否有其他人在Swift 3中发现他们的标题现在被iOS转变为句子案例?如果是这样,我们想要的是什么?
我应该记录Apple的错误,还是应该在HTTPURLResponse上创建一个类别,以允许自己不区分大小写地找到标题值.
Aar*_*ger 11
更新:这是一个已知问题.
allHeaderFields
应返回不区分大小写的字典,因为这是HTTP规范所要求的.看起来像Swift错误,我会提交雷达或错误报告.
以下是一些简单再现问题的示例代码:
let headerFields = ["ETag" : "12345678"]
let url = URL(string: "http://www.example.com")!
let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: headerFields)!
response.allHeaderFields["eTaG"] // nil (incorrect)
headerFields["eTaG"] // nil (correct)
Run Code Online (Sandbox Code Playgroud)
(改编自CédricLuthi的这个要点.)
基于@Darko的答案,我做了一个Swift 3
扩展,可以让您查找任何不区分大小写的标头:
import Foundation
extension HTTPURLResponse {
func find(header: String) -> String? {
let keyValues = allHeaderFields.map { (String(describing: $0.key).lowercased(), String(describing: $0.value)) }
if let headerValue = keyValues.filter({ $0.0 == header.lowercased() }).first {
return headerValue.1
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
更有效的解决方法:
(response.allHeaderFields as NSDictionary)["etag"]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4652 次 |
最近记录: |