Alamofire: request.responseString - stringSerializationFailed (Unicode (UTF-8))

Criado em 26 dez. 2017  ·  3Comentários  ·  Fonte: Alamofire/Alamofire

* Versão Alamofire: 4.4.0* Versão do Xcode: 8.3.2
* Versão Swift: Apple Swift versão 3.1 (swiftlang-802.0.53 clang-802.0.42)* Plataforma (s) executando o Alamofire: Qualquer simulador (xcode 8.3.2)

Oi, alguém poderia me ajudar a descobrir isso. Obrigado.

Estou fazendo duas solicitações de html diferentes com Alamofire, ambas funcionam bem usando um navegador e retornam a mesma fonte html, no entanto, usando Alamofire, um deles falha ao decodificar a resposta de dados para string.
Observe que a pequena diferença nos urls é que o segundo url tem um 'n' no final

let urlString1 = "http://www.dictionary.com/browse/andalusia"
let urlString2 = "http://www.dictionary.com/browse/andalusian"

Alamofire.request(urlString<1 or 2>).responseString { (response) in
    switch response.result {
    case .success(let value):
        // Do something with html string
    case .failure(let error):
        print(error)
    }
}

Resultados:

  • urlString1 obtém string html bem
  • urlString2 imprime erro:
    Alamofire.AFError.responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.stringSerializationFailed(Unicode (UTF-8)))
support

Comentários muito úteis

@ fantasma eu encontro o mesmo problema

Resolvi usando .responseData & String(decoding:as:)

    Alamofire.request(...).responseData { response in
        guard let data = response.data else { return }
        let utf8Text = String(data: data, encoding: .utf8) ?? String(decoding: data, as: UTF8.self)
    }

Observou que String (data: encoding :) é mais rápido que String (decoding: as :)

Ref:
https://bugs.swift.org/browse/SR-6261

Todos 3 comentários

Como diz a descrição do erro, Alamofire não conseguiu analisar a string como UTF-8 (apesar de ser o que dictionary.com retorna por padrão). Você deve investigar se a resposta deles é realmente uma string UTF-8 válida. Se não se pode esperar que o site retorne um tipo apropriado, então você pode querer escrever seu próprio analisador de string que pode retornar para outras codificações.

@ fantasma eu encontro o mesmo problema

Resolvi usando .responseData & String(decoding:as:)

    Alamofire.request(...).responseData { response in
        guard let data = response.data else { return }
        let utf8Text = String(data: data, encoding: .utf8) ?? String(decoding: data, as: UTF8.self)
    }

Observou que String (data: encoding :) é mais rápido que String (decoding: as :)

Ref:
https://bugs.swift.org/browse/SR-6261

@ gaplo917
obrigado salvou meu dia ;-)

Esta página foi útil?
0 / 5 - 0 avaliações