我想通过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
ios - 如何在Alamofire 4.5,Swift 4的 header 中发送`apikey`?-LMLPHP

但是在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调试的,尤其是lldbpo命令)

如您所见,授权标头的名称以大写字母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/

10-11 23:00