Alamofire 不发送当前标头(swift)

Posted

技术标签:

【中文标题】Alamofire 不发送当前标头(swift)【英文标题】:Alamofire not sending the current headers (swift) 【发布时间】:2016-02-10 02:44:11 【问题描述】:

当我使用 alamofire 时,甚至当我连接到服务器时,我不断收到“error_type”:“OAuthException”,“code”:“41”,我从标头授权之前获取数据。我认为它一直发送相同的标头,如何确保 alamofire 发送当前标头?

    let headers = ["Authorization" : "\(AccessToken) \(TokenType)"]
    print(headers)

    Alamofire.request(.GET, "url/profile/", headers: headers, encoding: .JSON).responseJSON  response in
        switch response.result 

编辑 首先,我使用登录 API

    let parameters = [
        "client_id": "\(Constant.clientId)",
        "client_secret": "\(Constant.clientSecret)",
        "response_type": "\(Constant.responseType)",
        "scope" : "\(Constant.scope)",
        "redirect_uri": "\(Constant.redirect)",
        "email": "\(email!)",
        "password": "\(pass!)"

    ]

    print(parameters)

    Alamofire.request(.POST, "http://url/login/", parameters: parameters, encoding: .JSON).responseJSON  response in
        switch response.result 
        case .Success:

            if let value = response.result.value 
                let json = JSON(value)
                print("JSON: \(json)")
                let accessToken = json["access_token"].string!
                let refreshToken = json["refresh_token"].string
                let tokenType = json["token_type"].string!
                let expiresIn = json["expires_in"].string
 

然后,我使用accessTokentokenType 进行授权

 if(refreshToken != nil)
                
 let headersCust = ["Authorization" : "\(accessToken) \(tokenType)"]
                    print(headersCust)
Alamofire.request(.GET, "http://goodies.co.id/api/v1/customer/profile/", headers: headersCust, encoding: .JSON).responseJSON  response in 

【问题讨论】:

【参考方案1】:

通常这个问题是由Redirection引起的。使用诸如 Proxyman 之类的网络调试工具可以帮助您了解是否属于这种情况;如果是这样:

这是 Alamofire 5(AF 5) 解决方案:

let headers: [String:String] = [...]
let params: [String: Any] = [...]
let url = URL(...)
let redirector = Redirector(behavior: Redirector.Behavior.modify( (task, urlRequest, resp) in
  var urlRequest = urlRequest
  headers.forEach  header in
    urlRequest.addValue(header.value, forHTTPHeaderField: header.key)
  
  return urlRequest
  ))
  //use desired request func of alamofire and your desired enconding
  AF.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers)
            .responseJSON  response in
                //handleDataResponse...
            .redirect(using: redirector)

【讨论】:

【参考方案2】:

我希望你使用最新的Alamofire,所以这里是.GET请求的代码:

let headers = [
    "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
    "Content-Type": "application/x-www-form-urlencoded"
]

Alamofire.request(.GET, "https://httpbin.org/get", headers: headers)
         .responseJSON  response in
             debugPrint(response)
         

参考:https://github.com/Alamofire/Alamofire 试试这个!并确保您发送正确的标头。

【讨论】:

我正在使用 alamofire 3,我认为它是最新的,它只发生在带有标题 @Sohil 的 .GET 中 @AldoLazardi 您是否尝试过使用 POSTMAN 确认您的请求? 在邮递员中它显示了我在调试器上获得的相同数据,我认为这不是标题问题,我认为当我获得错误授权时。问题是它不是服务器/API 故障,因为它在另一个平台(android/web)上运行良好。让我编辑我的问题以解释我是如何获得授权的

以上是关于Alamofire 不发送当前标头(swift)的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 2.0 和 Swift 2 - 标头不工作。看看如何修复它

发送请求时从数据库中删除 Swift Alamofire“+”号

如何使用标头从服务器 Alamofire swift 获取数据

如何在 Alamofire 4 和 Swift 3 中设置方法、标题、参数

Alamofire - 带有自定义标头的 Rest API 调用

Alamofire 未创建身份验证标头来发送凭据