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

我使用Alamofire在我的应用程序中执行所有与networking有关的请求。 在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上与Alamofire社区开了这个问题, 这是他们的回应 。 希望这可以帮助那些面临类似问题的人。

所以根据Alamofire社区对我在上面的问题上在GitHub上打开的问题,他们认为这是一个很常见的行为,解决这个问题的方法是URLEncoding.queryStringGET请求中的参数进行编码,因为有些服务器不喜欢GET请求中的bodyData

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

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

而这完全为我工作。

我刚刚尝试成功:

将您的参数转换为[String: AnyObject]

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

希望这可以帮助。

我想出了我的问题。 在我的路由器,我有我的GET请求使用JSONEncoding:

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

为了解决这个问题,我把它改成了URLEncoding:

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