使用 "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 一起使用。

你会遇到问题,因为不幸的是,这个问题没有好的解决方案。 AuthorizationReserved 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