我必须修改标题授权,值以" token xxxx "开头,以调用某些端点以获取我的值项目;
最近我的同事创建了一个新的终点,我使用了完全相同的方法来调用它,但它总是返回状态代码500 。
如果我重定向请求并在方法中添加授权:
- [nsurlsessionTaskDelegate urlsession:任务:WillPerformhttPredirection:newRequest:newRequest:pleastionHandler:]
然后它将起作用。这意味着urlsession在打电话时不会在标题中传递授权密钥。
从苹果公司的文档中说,我们不应该修改标题授权,但是为什么只有此端点有此问题?
这是用授权密钥调用我的端点的简单代码:
let session = URLSession(configuration: URLSessionConfiguration.default)
let url = URL(string: "https://www.myurl.com/api/newAPI")!
var urlRequest = URLRequest(url: url)
urlRequest.addValue("Token XXXX", forHTTPHeaderField: "Authorization")
urlRequest.httpMethod = "GET"
session.dataTask(with: urlRequest) { (data, response, error) in
...
有时与路径有关,请仔细检查您的同事所写的路径,也许您在路径末端缺少'/'。
如果在实现...willPerformHTTPRedirection...
之后起作用,则您正在调用的url
的API路径不是请求的最终目的地。您发送的初始请求是由url
的服务器重定向到另一个URL,最终正在处理。
默认情况下,出于安全原因,大多数HTTP客户端在遵循重定向时剥离Authorization
标头 - 他们想阻止您意外地将授权信息泄漏到您不打算达到的服务器。这就是为什么您会看到您看到的错误(尽管500错误表明在Authorization
标头完全丢失的情况下,服务器也未正确配置(。
您可以通过调用curl -v https://www.myurl.com/api/newAPI
并查看返回哪些状态代码来测试这一点(可能是您所描述的301或302,即重定向(。尝试找出您被重定向到的URL(重定向目标将位于您从该curl
Invocation获得的响应的Location
标题中(。然后在 let url = URL(theActualURL)!
中设置值,然后重试。