我想通过Alamofire 4.5发出HTTP发布请求。该请求需要一个授权标头(这是一个Api密钥)。但是无论何时我发出请求,我的服务器都无法检测到ApiKey
。
这是我如何发出Alamofire请求
let params : [String : Any] =["param1":param1,"param2":param2]
let headers : HTTPHeaders = ["authorization" : apiKey]
Alamofire.request(MY_URL, method: .post, parameters: params, headers: headers).responseJSON {
response in
switch response.result{
case .success(let result):
//other code here
}
我三重检查了
apiKey
的值,该值正确,但是发送了请求,我的服务器根本无法检测到authorization
。我完全不知道我在这里是否做错什么,因为我是Swift的新手。请提供适当的解决方案。谢谢
编辑:
在我的服务器代码中,我使用Slim 2
$app->map('/MY_URL','authenticate',function ()use($app){
}
'authenticate'是扫描标题中的
authorization: apiKey
的要点,所以现在的问题是我的服务器无法获取apiKey
的值,因此总是出现相同的错误“Api Key is missing”,该错误在找不到Api Key时设置。我在Alamofire Documentation中尝试了以下方法,但结果仍然相同。
我尝试了什么:
let headers: HTTPHeaders = [
"Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
"Accept": "application/json"
]
Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in
debugPrint(response)
}
我在这里缺少什么?有人可以给我一些提示。谢谢。
编辑:
为了更清楚我的意思,我的意思是
authorization : apiKey
,我展示了我在Postman
中发出请求的方式。通常我只是在请求的Headers中插入
"authorization": apiKey
但是在Swift中,Web服务无法获取
apiKey
的值,因此服务器始终返回以下响应:{
"error": true,
"message": "Api key is missing"
}
最佳答案
TLDR;
问题是iOS的URLRequest
自动将标题大写。同时,您的API并未遵循最佳做法。
更改您的API以使其符合RFC 7230
并允许其不区分大小写地接受标头。
整个故事:
起初,您的问题似乎有些奇怪,因为您提供的内容中显然没有错误的代码。不过,我尝试在邮递员中重现您的请求。
现在我们应该停止,我必须警告您不要在“这里是我的请求”部分中发布您所做的事情。那里提供的信息使我可以在Postman中完全重现您的请求(包括标题和确切字段的名称和值),这对于解决您的问题很有帮助。但是与此同时,您也将自己的个人信息共享给了所有人,甚至还向看到您问题的所有人购买了API密钥。显然这不好,我建议您尽可能更改API密钥。
然后,我尝试了您的代码,发现与您谈论的行为完全相同。我调试了responseJSON
闭包并观察了response.request?.allHTTPHeaderFields
属性:
(lldb) po response.request?.allHTTPHeaderFields
▿ Optional<Dictionary<String, String>>
▿ some : 2 elements
▿ 0 : 2 elements
- key : "Content-Type"
- value : "application/x-www-form-urlencoded; charset=utf-8"
▿ 1 : 2 elements
- key : "Authorization"
- value : "f8f99f9506d14f0590863d5883aaac9b"
(如果您不理解我写的内容,内容是关于xcode调试的,尤其是
lldb
的po
命令)如您所见,授权标头的名称以大写字母A开头,即使我都将其全部小写。
我尝试用大写A向邮递员发送新请求,是的-我了解到您的API仅接受小写的授权标头名称。
您现在想:“这不是真正的问题。” “我们应该只在某个地方更改授权头名称,就可以了,对吧?”
不太容易。
我尝试了几件事,所有这些都使我进入了URLRequest的
setValue(_:forHTTPHeaderField:)
方法。 Alamofire称之为,我也尝试过。令人惊讶的是,调用此方法后,“授权”标头始终更改为“授权”。然后我发现这件事对我们特别有趣:请注意,为了与HTTP RFC保持一致,HTTP标头字段名称不区分大小写。
请记住,我什至尝试直接更改URLRequest的
allHTTPHeaderFields
。有同样的结果。这导致我们得出以下结论:Apple故意忽略输入标头的大小写,并且非常不负责任地对其进行更改(再次故意这样做,因为它至少在某处花费了几行代码,而不仅仅是将给定的标头直接插入请求中)。到目前为止,我还不知道该问题的解决方案(如果我们要将其归类为有点争议的问题)。搜索表明存在于iOS的早期版本(http://0xced.blogspot.com.by/2010/06/fixing-nsmutableurlrequest.html)。您可以调用一些 private 的Objective-C API,这可能会有所帮助,但实际上,您会获得不稳定或不确定的行为,并有可能被App Store拒绝。
因此,我的结论以及在这种情况下唯一正确的选择就是更改您的API。
关于ios - 如何在Alamofire 4.5,Swift 4的 header 中发送`apikey`?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47716495/