使用参数编码时请求超时JSONEncoding.default

时间:2016-12-27 07:00:33

标签: ios swift alamofire

我正在使用Alamofire在我的应用中执行所有与网络相关的请求。我在get请求中将参数编码为JSON时遇到问题。

根据我的要求:

 Alamofire.request(url, method: .get, parameters: params, encoding: JSONEncoding.default)
 .responseJSON(completionHandler: { (response) in
     switch response.result {
     case .success(let retrivedResult):
         print(retrivedResult)
//         success(brandTags)
         break
     case .failure(let errorGiven):
         print(errorGiven)
         print(String(data: response.data!, encoding: String.Encoding.utf8) ?? "")
         failure(APICaller.parseErrorAndGiveMessage(givenError: errorGiven as NSError))
         break
     }
 })

当我将参数编码为JSONEncoding.default时,请求总是在我的日志中超时:

2016-12-27 12:22:41.425948 xyz[5140:133008] [] nw_endpoint_flow_service_writes [2.1 35.164.98.40:80 ready socket-flow (satisfied)] Write request has 4294967295 frame count, 0 byte count
2016-12-27 12:23:41.485534 xyz[5140:133041] [] nw_endpoint_flow_service_writes [2.1 35.164.98.40:80 ready socket-flow (satisfied)] Write request has 4294967295 frame count, 0 byte count

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSUnderlyingError=0x60000024a9b0 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=http://xyz-beta.abc.com/v1/brands/1a1/notifications, NSErrorFailingURLKey=http://xyz-beta.abc.com/v1/brands/1a1/notifications, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=The request timed out.}
2016-12-27 12:23:41.488336 xyz[5140:133868] [] __tcp_connection_write_eof_block_invoke Write close callback received error: [89] Operation canceled

但是,当我删除如下所示的参数编码时,请求正确完成,没有任何问题。

Alamofire.request(url, method: .get, parameters: params, encoding: JSONEncoding.default)
     .responseJSON(completionHandler: { (response) in
         switch response.result {
         case .success(let retrivedResult):
             print(retrivedResult)
    //         success(brandTags)
             break
         case .failure(let errorGiven):
             print(errorGiven)
             print(String(data: response.data!, encoding: String.Encoding.utf8) ?? "")
             failure(APICaller.parseErrorAndGiveMessage(givenError: errorGiven as NSError))
             break
         }
     })

有什么不同?

更新

我在Github和this is their response上向Alamofire社区公开了这个问题。希望这可以帮助那些遇到类似问题的人。

3 个答案:

答案 0 :(得分:3)

所以根据我在GitHub上针对我的上述问题打开的issue上的Alamofire社区,他们认为这是一种非常常见的行为,并且解决方法是URLEncoding.queryString编码GET请求中的参数,因为某些服务器不喜欢bodyData请求中的GET

基本上我的请求代码修改如下:

Alamofire.request(url, method: .get, parameters: params, encoding: URLEncoding.queryString)
 .responseJSON(completionHandler: { (response) in
     switch response.result {
     case .success(let retrivedResult):
         print(retrivedResult)
//         success(brandTags)
         break
     case .failure(let errorGiven):
         print(errorGiven)
         print(String(data: response.data!, encoding: String.Encoding.utf8) ?? "")
         failure(APICaller.parseErrorAndGiveMessage(givenError: errorGiven as NSError))
         break
     }
 })

这对我来说非常有用。

答案 1 :(得分:0)

我刚刚尝试过并取得了成功:

将您的参数投放为[String: AnyObject]

let params: [String: AnyObject] = ["param1": value1 as AnyObject, "param2": value2 as AnyObject]

希望这有帮助。

答案 2 :(得分:0)

我发现了我的问题。在我的路由器中,我使用JSONEncoding获取了我的GET请求:

  

urlRequest =尝试JSONEncoding.default.encode(urlRequest,带:   参数)

要修复它,我将其更改为URLEncoding:

  

urlRequest =尝试URLEncoding.default.encode(urlRequest,带:   参数)