簡體   English   中英

如何在Alamofire 4.5,Swift 4中的標頭中發送`apikey`?

[英]How to send `apikey` in header in Alamofire 4.5,Swift 4?

我想通過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的關鍵點authorization: apiKey標頭中的authorization: apiKey ,所以現在的問題是我的服務器無法獲取apiKey的值,因此始終給出相同的錯誤“ Api Key is missing”,該錯誤在找不到Api Key時設置。

我嘗試了以下Alamofire文檔中的方法,但結果仍然相同。

我試過的

 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"
}

使用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 :(")

        }
    }

配置是可選的,您唯一需要做的就是正確設置請求。 確保( 雙重確認 )您正確設置了身份驗證的格式。

在某些情況下(並非罕見),應采用以下格式:

["Authorization": "Bearer <#your_token#>"]

我對Slim 2的發現也與Bearer所以也許您錯過了它。 https://github.com/dyorg/slim-token-authentication/tree/master/example#making-authentication-via-header

來自此的示例:

$ curl -i http://localhost/slim-token-authentication/example/restrict -H "Authorization: Bearer usertokensecret"

使用此命令,您還可以使用簡單的curl命令檢查此命令是否有效。 這應該。 如果沒有,肯定是您要發送的字段存在問題,而不是Alamofire本身存在問題。

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

    /// 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

這是一個例子:

Alamofire.request("https://...",
                   method: .get,
                   parameters: ["myKey1": "myValue1"], 
                   encoding: JSONEncoding.default,
                   headers: self.authHeader).responseJSON { response in 
                        //your response
                   }

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:)方法的setValue(_:forHTTPHeaderField:) Alamofire稱之為,我也嘗試過。 令人驚訝的是,調用此方法后,“授權”標頭始終更改為“授權”。 然后我發現這件事對我們特別有趣:

請注意,為了與HTTP RFC保持一致,HTTP標頭字段名稱不區分大小寫。

請記住,我什至嘗試直接更改URLRequest的allHTTPHeaderFields 有同樣的結果。

這導致我們得出以下結論:Apple故意忽略了輸入標頭的大小寫,並且非常不負責任地對其進行了更改(再次故意這樣做,因為它在某處至少需要幾行代碼,而不僅僅是將給定的標頭直接插入請求中)。 到目前為止,我還沒有解決該問題的方法(如果我們想將其歸類為有點爭議的問題)。 搜索表明存在於iOS的早期版本中( http://0xced.blogspot.com.by/2010/06/fixing-nsmutableurlrequest.html )。 可以調用一些私有的Objective-C API,這可能會有所幫助,但實際上,您將獲得不穩定或不確定的行為,並有可能被App Store拒絕。

所以我的結論,在這種情況下,也許唯一正確的選擇是更改您的API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM