我想通过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
但在Swift中,Web服务无法获得apiKey
的值,因此服务器始终返回以下响应:
{
"error": true,
"message": "Api key is missing"
}
答案 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)
问题是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。