如何在Alamofire 4.5,Swift 4中的头文件中发送`apikey`?

时间:2017-12-08 14:37:17

标签: ios alamofire swift4

我想通过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){

}

'验证'是扫描标题中authorization: apiKey的点,所以现在问题是我的服务器无法获得apiKey的值因此总是给出相同的错误" Api Key丢失"当没有找到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中显示我提出请求的方式。

通常我只是在请求中的标题中插入"authorization": apiKey

enter image description here

但在Swift中,Web服务无法获得apiKey的值,因此服务器始终返回以下响应:

{
  "error": true,
  "message": "Api key is missing"
}

3 个答案:

答案 0 :(得分:0)

对于 Alamofire 4.6.0

,这对我来说很好
    let url = "WEB API URL"
    let headers = [
        "Content-Type":"application/x-www-form-urlencoded",
        "authorization" : "apiKey"
    ]

    let configuration = URLSessionConfiguration.default
    configuration.requestCachePolicy = .reloadIgnoringLocalCacheData
    let params : [String : Any] = ["param1":param1,"param2":param2]

    Alamofire.request(url, method: .post, parameters: params as? Parameters, encoding: URLEncoding.httpBody, headers: headers).responseJSON { response in

        if let JSON = response.result.value {
            print("JSON: \(JSON)")

        }else{
            print("Request failed with error: ",response.result.error ?? "Description not available :(")

        }
    }

答案 1 :(得分:0)

配置是可选的,您唯一需要的是正确设置请求。确保(双重确认)正确格式化身份验证。

在某些情况下(不是极少数情况下,这应格式化为:

App.js

我发现的["Authorization": "Bearer <#your_token#>"] 也与Slim 2有关,所以也许你错过了这个。 https://github.com/dyorg/slim-token-authentication/tree/master/example#making-authentication-via-header

此示例:

Bearer

有了这个,您还可以检查这是否适用于简单的$ curl -i http://localhost/slim-token-authentication/example/restrict -H "Authorization: Bearer usertokensecret" 命令。这应该。如果没有,那么您发送的字段肯定存在问题,而不是Alamofire本身。

在Alamofire的文档中,您可以找到:

curl

以下是一个例子:

    /// Creates a `DataRequest` using the default `SessionManager` to retrieve the contents of the specified `url`,
    /// `method`, `parameters`, `encoding` and `headers`.
    ///
    /// - parameter url:        The URL.
    /// - parameter method:     The HTTP method. `.get` by default.
    /// - parameter parameters: The parameters. `nil` by default.
    /// - parameter encoding:   The parameter encoding. `URLEncoding.default` by default.
    /// - parameter headers:    The HTTP headers. `nil` by default.
    ///
    /// - returns: The created `DataRequest`.
public func request(_ url: URLConvertible, method: Alamofire.HTTPMethod = default, parameters: Parameters? = default, encoding: ParameterEncoding = default, headers: HTTPHeaders? = default) -> Alamofire.DataRequest

答案 2 :(得分:0)

TLDR;

问题是iOS URLRequest自动将标头大写。与此同时,API不遵循最佳实践。

更改您的API以符合RFC 7230并允许其接受标题不区分大小写

整个故事:

首先,您的问题似乎有点奇怪,因为您提供的内容中没有明显错误的代码。不过我试图在邮差中重现你的请求。

现在我们应该停下来,我必须警告你永远不要发布你在你的所做的事情;这是我的要求&#34;部分。在那里给出的信息允许我在邮递员中完全重现您的请求(包括标题和确切的字段&#39;名称和值),这有助于解决您的问题。但与此同时,您可能会向所有看到您问题的人分享您的私人信息,甚至可能购买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的{​​{1}}命令)

正如您所看到的,授权标题的名称以大写A字母开头,即使我将其全部小写传递。

我尝试使用带有大写A的邮递员发送新请求,是的 - 我了解到您的API只接受较低级别的授权标题名称。

&#34;这不是一个真正的问题&#34;你现在想。 &#34;我们应该在某处更改我们的授权标题名称,它应该没问题,对吗?&#34;

不太容易。

我尝试了一些引导我使用URLRequest的setValue(_:forHTTPHeaderField:)方法的东西。 Alamofire称之为,我也尝试过。在调用这种方法后,令人惊讶的是#34;授权&#34;标题始终更改为&#34;授权&#34;。然后我找到了对我们特别有趣的东西:

  

请注意,为了与HTTP RFC保持一致,HTTP头字段名称不区分大小写。

请注意,我甚至尝试直接更改了URLRequest&#39; s po。得到了相同的结果。

这导致我们得出以下结论:Apple故意忽略输入标题&#39; case并且非常不负责任地更改它(再次故意,因为它在某处需要至少几行代码而不是直接将给定的头插入请求中)。截至目前,我知道这个问题没有可能的解决方案(如果我们想把它归类为一个有点争议的问题)。搜索说这是从早期的iOS(http://0xced.blogspot.com.by/2010/06/fixing-nsmutableurlrequest.html)开始存在的。您可以调用一些可以帮助的私有Objective-c API,但实际上您会得到不稳定或未定义的行为,并且可能会被App Store拒绝。< / p>

所以我的结论,也许在这种情况下唯一正确的选择就是改变你的API。