[英]How to pass Origin to Header in Alamofire Swift iOS?
[英]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
}
問題是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:)
方法的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.