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

Posted

技术标签:

【中文标题】使用参数编码 JSONEncoding.default 时请求超时【英文标题】:Request getting timed out when using parameter encoding JSONEncoding.default 【发布时间】:2016-12-27 07:00:33 【问题描述】:

我正在使用 Alamofire 在我的应用程序中执行所有与网络相关的请求。我在获取请求中将参数编码为 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 社区和 this is their response 上打开了这个问题。希望这对遇到类似问题的人有所帮助。

【问题讨论】:

【参考方案1】:

因此,根据我在 GitHub 上针对上述问题打开的 issue 上的 Alamofire 社区,他们建议这是一种非常常见的行为,已多次出现,对此的解决方案是 URLEncoding.queryString 编码 @ 中的参数987654323@ 请求,因为某些服务器不喜欢 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
     
 )

这对我来说非常有效。

【讨论】:

tnx.你节省了我的时间。【参考方案2】:

我刚刚尝试并成功:

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

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

希望这会有所帮助。

【讨论】:

感谢您的回复。请参阅我更新的问题以供将来参考。 是的,我会检查的。同样的问题:)【参考方案3】:

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

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

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

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

【讨论】:

以上是关于使用参数编码 JSONEncoding.default 时请求超时的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用声明的变量作为参数调用 UDF 比使用硬编码参数调用要快得多

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

FFmpeg使用X264编码参数

使用 String addedPercentEncoding 将字符串编码为查询参数

如何批量修改linux 文件编码格式

Url.Action 是编码参数值