【发布时间】:2017-06-30 09:41:47
【问题描述】:
我正在使用的后端 API 需要在每个针对 HTTP 标头键 Authorization 的请求中发送一个令牌,格式为 Token xxxxxxxxxx。
现在,我正在执行以下操作。
var getRequest = URLRequest(url: url)
getRequest.addValue("Token xxxxxxxx", forHTTPHeaderField: "Authorization")
这有时会起作用,有时会在发送请求时剥离标头字段Authorization。我使用 Charles 代理检查了这一点。
Apple's documentation 声明如下。
NSURLSession 对象旨在处理 适合您的 HTTP 协议。因此,您不应修改 以下标头:授权、连接、主机、WWW-Authenticate
作为解决方案,许多人建议对 URLSession 使用 didReceiveAuthenticationChallenge 委托方法。
在这里,您需要传递一个URLSession.AuthChallengeDisposition 实例来说明您希望如何响应质询,并传递一个URLCredential 实例来传递凭据以响应身份验证质询。
我不知道如何以及是否可以创建一个URLCredential 实例,该实例将为标题字段Authorization 添加Token xxxxxxxx。
请有更多知识的人帮我解决这个问题?
PS - 这个问题中提到的所有代码都在 Swift 3 中。
This question 询问与我所拥有的类似的问题。但是,那里给出的答案对我不起作用。而且,在有关 Apple 不允许添加 Authorization 标头的问题下提出的一些问题没有得到解答。
编辑:
贴出相关代码。
var getRequest = URLRequest(url: url)
getRequest.httpMethod = "GET"
getRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
getRequest.addValue("application/json", forHTTPHeaderField: "Accept")
let token = DataProvider.sharedInstance.token
getRequest.addValue("Token \(token)", forHTTPHeaderField: "Authorization")
let getTask = URLSession.shared.dataTask(with: getRequest) { (data, response, error) in
if let data = data {
print("--------GET REQUEST RESPONSE START--------")
print("CODE: \((response as? HTTPURLResponse)?.statusCode ?? 0)")
print("Response Data:")
print(String(data: data, encoding: .utf8) ?? "")
print("--------GET REQUEST RESPONSE END--------")
}
}
getTask.resume()
在这里,我可以确认“授权”的标头字段已添加到请求的标头字典中。
但是,当我检查到达服务器的请求时,缺少“授权”的标头字段。有什么想法吗?
【问题讨论】:
-
request.addValue(value, forHTTPHeaderField: key)根据我的经验工作可靠。我怀疑在“问题情况”中没有为请求调用您的代码。请发布更多相关代码来解决这个问题。 -
@shallowThought 我已经添加了相关代码。请看看你是否能发现我所做的事情有问题。
标签: ios swift nsurlsession nsurlsessionconfiguration