使用 "Authorization" header 下载文件时出现 400 错误
400 error when downloading file with "Authorization" header
服务器返回一个 json 文件,即:
{"ctrl":{"code":400,"text":"Not valid Access token","ts":"2020-03-05T11:54:01.547Z"}}
代码:
public func startDownload(url: URL, pathURL: URL) {
let accessToken: String! = "Bearer \(Constants.access_token)"
self.dirURL = pathURL
var request = URLRequest(url: url)
guard let token = accessToken else { return }
request.addValue(token, forHTTPHeaderField: "Authorization")
downloadTask = backgroundSession.downloadTask(with: request)
downloadTask.resume()
}
仅供参考:访问令牌有效,它正在与 Postman 一起使用。
你会遇到问题,因为不幸的是,这个问题没有好的解决方案。 Authorization
是 Reserved HTTP Headers 之一,在 URLRequest
header 或 URLSessionConfiguration.httpAdditionalHeaders
中设置它可能根本不起作用:
If you set a value for one of these reserved headers, the system may ignore the value you set, or overwrite it with its own value, or simply not send it.
人们可能希望您可以在处理身份验证挑战的 URLSessionTaskDelegate
方法 urlSession(_:task:didReceive:completionHandler:)
中提供此令牌,但您需要在其中提供 URLCredential
object,并且可悲的是,它没有采用 Bearer
标记的构造函数,所以这是一个 no-go.
所以基本上,如果不编写自己的 URLProtocol
实现,最好的办法是在一些额外的自定义 header 字段中发送令牌,并让服务器从那里获取它(如果您可以控制服务器代码)。 Source
服务器返回一个 json 文件,即:
{"ctrl":{"code":400,"text":"Not valid Access token","ts":"2020-03-05T11:54:01.547Z"}}
代码:
public func startDownload(url: URL, pathURL: URL) {
let accessToken: String! = "Bearer \(Constants.access_token)"
self.dirURL = pathURL
var request = URLRequest(url: url)
guard let token = accessToken else { return }
request.addValue(token, forHTTPHeaderField: "Authorization")
downloadTask = backgroundSession.downloadTask(with: request)
downloadTask.resume()
}
仅供参考:访问令牌有效,它正在与 Postman 一起使用。
你会遇到问题,因为不幸的是,这个问题没有好的解决方案。 Authorization
是 Reserved HTTP Headers 之一,在 URLRequest
header 或 URLSessionConfiguration.httpAdditionalHeaders
中设置它可能根本不起作用:
If you set a value for one of these reserved headers, the system may ignore the value you set, or overwrite it with its own value, or simply not send it.
人们可能希望您可以在处理身份验证挑战的 URLSessionTaskDelegate
方法 urlSession(_:task:didReceive:completionHandler:)
中提供此令牌,但您需要在其中提供 URLCredential
object,并且可悲的是,它没有采用 Bearer
标记的构造函数,所以这是一个 no-go.
所以基本上,如果不编写自己的 URLProtocol
实现,最好的办法是在一些额外的自定义 header 字段中发送令牌,并让服务器从那里获取它(如果您可以控制服务器代码)。 Source