Alamofire: request.responseString - stringSerializationFailed (Юникод (UTF-8))

Созданный на 26 дек. 2017  ·  3Комментарии  ·  Источник: Alamofire/Alamofire

* Версия Alamofire: 4.4.0* Версия Xcode: 8.3.2
* Версия Swift: Apple Swift версии 3.1 (swiftlang-802.0.53 clang-802.0.42)* Платформы, на которых работает Alamofire: Any simulator (xcode 8.3.2)

Привет, может кто-нибудь помочь мне разобраться в этом. Спасибо.

Я выполняю два разных html-запроса с помощью Alamofire, оба отлично работают с использованием браузера и возвращают один и тот же источник html, однако при использовании Alamofire один из них не может декодировать ответ данных на строку.
Обратите внимание на небольшую разницу в URL-адресах: второй URL-адрес имеет в конце букву «n».

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

Полученные результаты:

  • urlString1 получает строку html нормально
  • urlString2 выводит ошибку:
    Alamofire.AFError.responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.stringSerializationFailed(Unicode (UTF-8)))

Самый полезный комментарий

@ghost Я столкнулся с той же проблемой

Я решил, используя .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)
    }

Отметил, что String (data: encoding :) быстрее, чем String (decoding: as :)

Ссылка:
https://bugs.swift.org/browse/SR-6261

Все 3 Комментарий

Как сказано в описании ошибки, Alamofire не смог проанализировать строку как UTF-8 (несмотря на то, что dictionary.com возвращает по умолчанию). Вам следует выяснить, является ли их ответ действительной строкой UTF-8. Если нельзя рассчитывать, что сайт вернет правильный тип, вы можете написать свой собственный синтаксический анализатор строк, который может откатиться к другим кодировкам.

@ghost Я столкнулся с той же проблемой

Я решил, используя .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)
    }

Отметил, что String (data: encoding :) быстрее, чем String (decoding: as :)

Ссылка:
https://bugs.swift.org/browse/SR-6261

@ gaplo917
спасибо, что спасли мне день ;-)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги