2016-12-27 2 views
6

Я использую Alamofire для выполнения всех сетевых запросов в моем приложении. Я столкнулся с проблемой при параметре кодирования как JSON в запросе get.Запросить время при использовании кодировки параметров JSONEncoding.default

Следуя по моей просьбе:

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

В чем разница?

UPDATE:

Я открыл этот вопрос с Alamofire сообщества на Github и this is their response. Надеюсь, что это поможет людям, столкнувшимся с подобной проблемой.

ответ

3

Итак, в соответствии с сообществом Alamofire на issue я открыл на GitHub мой предыдущий вопрос, они предполагают, что это очень распространенное поведение видели много раз, и решение это 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

tnx. вы спасли мое время. –

0

Я просто попытался и успех:

Отдайте свои параметры, как [String: AnyObject]

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

Надеется, что это помогает.

+0

Спасибо за ваш ответ. Пожалуйста, обратитесь к моему обновленному вопросу для дальнейшего использования. –

+0

Да, я проверю. Та же проблема здесь :) –

0

Я понял свою проблему. В моем маршрутизаторе я имел мои запросы GET с помощью JSONEncoding:

URLRequest = попробовать JSONEncoding.default.encode (URLRequest, с: параметрами)

Чтобы исправить это, я изменил его на URLEncoding:

URLRequest = попробовать URLEncoding.default.encode (URLRequest, с: параметрами)

Смежные вопросы