Estoy usando Alamofire para llevar a cabo todas las solicitudes relacionadas con la red en mi aplicación. Estoy enfrentando un problema al codificar el parámetro como JSON en la solicitud de obtención.

Siguiendo en mi solicitud:

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

Cuando codifico los parámetros como JSONEncoding.default como arriba, la solicitud siempre agota el tiempo de espera con lo siguiente en mis registros:

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

Pero cuando elimino la codificación de parámetros como se muestra a continuación, la solicitud se completa correctamente sin ningún problema.

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

¿Cuál es la diferencia?

ACTUALIZACIÓN:

Abrí este problema con la comunidad de Alamofire en Github y esta es su respuesta. Espero que esto ayude a las personas que enfrentaron un problema similar.

6
Rohan Sanap 27 dic. 2016 a las 10:00

3 respuestas

La mejor respuesta

De acuerdo con la comunidad de Alamofire sobre el problema abrí en GitHub para mi pregunta anterior, sugieren que este es un comportamiento muy común visto muchas veces y la solución a esto es URLEncoding.queryString codificar los parámetros en la solicitud GET porque a algunos servidores no les gusta bodyData en la solicitud GET.

Así que esencialmente mi código de solicitud se modificó así:

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

Y esto funcionó perfectamente para mí.

3
Rohan Sanap 20 ene. 2017 a las 08:21

Acabo de probar y éxito:

Transmite tu parámetro como [String: AnyObject]

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

Espero que esto ayude.

0
Quang Hà 4 ene. 2017 a las 08:29

Resolví mi problema. En mi enrutador, tuve mis solicitudes GET usando JSONEncoding:

urlRequest = prueba JSONEncoding.default.encode (urlRequest, con: parámetros)

Para solucionarlo, lo cambié a URLEncoding:

urlRequest = intente URLEncoding.default.encode (urlRequest, con: parámetros)

0
Sangwin Gawande 16 jun. 2017 a las 06:27