gpt4 book ai didi

ios - 如何在 URLSession 的 HTTP header 中为 'Token xxxxxxxxxx' 设置 'Authorization'

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:10 26 4
gpt4 key购买 nike

我正在使用的后端 API 要求针对 HTTP header key Authorization 的每个请求发送 token ,格式为 Token xxxxxxxxxx

现在,我正在执行以下操作。

var getRequest = URLRequest(url: url)
getRequest.addValue("Token xxxxxxxx", forHTTPHeaderField: "Authorization")

这有时有效,有时有时有效,当请求发出时, header 字段 Authorization 被剥离。我使用 Charles 代理检查了这个。

Apple's documentation陈述如下。

An NSURLSession object is designed to handle various aspects of the HTTP protocol for you. As a result, you should not modify the following headers: Authorization, Connection, Host, WWW-Authenticate

作为对此的解决方案,许多人建议对 URLSession 使用 didReceiveAuthenticationChallenge 委托(delegate)方法。

在这里,您需要传递一个 URLSession.AuthChallengeDisposition 实例来告诉您要如何响应挑战,并传递一个 URLCredential 实例来传递凭证以响应验证挑战。

我不知道如何以及是否可以创建一个 URLCredential 实例,该实例将为 header 字段 Authorization 添加 Token xxxxxxxx

可以请更有知识的人帮我解决这个问题吗?

PS - 这个问题中提到的所有代码都在 Swift 3 中。 This question问类似于我所拥有的东西。但是,那里给出的答案对我不起作用。而且,在有关 Apple 不允许添加 Authorization header 的问题下提出的一些问题没有得到解答。

编辑:

发布相关代码。

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()

在这里,我可以确认“授权”的 header 字段已添加到请求的 header 字典中。

但是,当我检查什么请求到达服务器时,“授权”的 header 字段丢失了。有什么想法吗?

最佳答案

我遇到了这个完全相同的问题,并发现我缺少尾部斜杠 / 是问题所在。

服务器正在发回 301 Redirect 响应。 URLSession 自动跟随重定向,但也会删除 Authorization header 。这可能是由于 Authorization 的“特殊状态”。根据URLSessionConfigurationdocumentation :

An URLSession object is designed to handle various aspects of the HTTP protocol for you. As a result, you should not modify the following headers:

  • Authorization
  • Connection
  • Host
  • WWW-Authenticate

如果需要 Authorization header ,请从 URLSessionTaskDelegate 实现 urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)。该方法在重定向时传递新请求,允许您添加回 header 。

例如

class APIClient: URLSessionTaskDelegate {
let session: URLSession!
initializeSession() {
// Create a new session with APIClient as the delegate
session = URLSession(configuration: URLSessionConfiguration.default,
delegate: self,
delegateQueue: nil)
}

// Perform the request
func fetchRecords(handler: () => void) {
var request = URLRequest(url: URL(string: "http://127.0.0.1:8000/api/employee/records")!)
request.setValue(retrieveToken(), forHTTPHeaderField: "Authorization")
session.dataTask(with: request, completionHandler: handler).resume()
}

// Implement URLSessionTaskDelegate's HTTP Redirection method
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
// Create a mutable copy of the new request, add the header, call completionHandler
var newRequest = request
newRequest.addValue(retrieveToken(), forHTTPHeaderField: "Authorization")
completionHandler(newRequest)
}
}

重要提示!

盲目相信重定向是个坏主意。您应该确保重定向到的 URL 与原始请求的域相同。为简洁起见,我已将其排除在我的代码示例之外。

关于ios - 如何在 URLSession 的 HTTP header 中为 'Token xxxxxxxxxx' 设置 'Authorization',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44843404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com