我正在使用的后端API要求使用此格式的HTTP标头密钥Authorization
的每个请求发送一个令牌 - Token xxxxxxxxxx
。
现在,我正在做以下事情。
var getRequest = URLRequest(url: url)
getRequest.addValue("Token xxxxxxxx", forHTTPHeaderField: "Authorization")
这有时会有效,有时候会在发出请求时删除标题字段Authorization
。我用查尔斯代理检查了这个。
Apple's documentation说明以下内容。
NSURLSession对象旨在处理的各个方面 适合您的HTTP协议。因此,您不应该修改 以下标题:授权,连接,主机,WWW-身份验证
作为解决方案,许多人建议对URLSession使用didReceiveAuthenticationChallenge
委托方法。
在这里,您需要传递一个URLSession.AuthChallengeDisposition
实例来说明您希望如何回应质询,并通过URLCredential
实例传递凭据以响应身份验证质询。
我不知道如何以及是否可以创建URLCredential
个实例,该实例会为标题字段Token xxxxxxxx
添加Authorization
。
有人可以提高知识水平,请帮我解决这个问题吗?
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()
在这里,我可以确认“授权”的标题字段已添加到请求的标题字典中。
但是,当我检查哪个请求命中服务器时,缺少“授权”的标头字段。有什么想法吗?
答案 0 :(得分:6)
我遇到了这个完全相同的问题,并发现我缺少一个尾部斜杠/
,这是问题。
服务器正在发回301 Redirect
响应。 URLSession
会自动跟随重定向,但也会删除Authorization
标头。这可能是由于Authorization
"特殊状态"。根据{{1}}' documentation:
URLSession对象旨在为您处理HTTP协议的各个方面。因此,您不应修改以下标题:
- 授权
- 连接
- 主机
- WWW验证
如果需要URLSessionConfiguration
标头,请从Authorization
实施urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)
。该方法在重定向上传递新请求,允许您添加回头。
e.g。
URLSessionTaskDelegate
重要提示!
盲目信任重定向是一个坏主意。您应该确保您重定向到的网址与原始请求的网址相同。为简洁起见,我将其从代码示例中删除了。