Я использую Retrofit 2.0.0-beta1 .
В тестах у меня есть альтернативный сценарий, и я ожидаю ошибки HTTP 400
Я бы хотел, retrofit.Response<MyError> response
ноresponse.body() == null
MyError не десериализуется - я вижу это только здесь
response.errorBody().string()
но это не дает мне MyError как объект
Ответы:
В настоящее время я использую очень простую реализацию, которая не требует использования конвертеров или специальных классов. Я использую следующий код:
источник
ErrorResponse - это ваш настраиваемый объект ответа
Котлин
Ява
источник
gson.fromJson(response.errorBody()?.charStream(), type)
Я решил это:
MyErrorMessage Класс:
источник
.addConverterFactory(ScalarsConverterFactory.create())
@RonelGonzalesВ Retrofit 2.0 beta2 я получаю ответы об ошибках следующим образом:
синхронный
Асинхронный
Обновление для Retrofit 2 beta3:
Асинхронный - параметр модернизации был удален из onResponse
источник
List<BasicResponse>
?В https://stackoverflow.com/a/21103420/2914140 и https://futurestud.io/tutorials/retrofit-2-simple-error-handling этот вариант показан для Retrofit 2.1.0.
источник
Создайте модель ответа об ошибке и пользователя Gson, чтобы преобразовать ответ на него. Это будет нормально работать.
APIError.java
MainActivity.java (внутри запроса onResponse)
источник
источник
Я сделал это для асинхронных вызовов с помощью Retrofit 2.0-beta2:
источник
Если вы используете Kotlin, другим решением может быть просто создание функции расширения для класса Response:
использование
источник
На самом деле это очень просто.
Котлин:
Ява:
Проверено при модернизации: 2.5.0. Прочтите текст из charStream, который даст вам строку, затем выполните синтаксический анализ в JSONObject.
Прощайте.
источник
readText()
на java нет расширения, используйте,TextStreamsKt.readText(response.errorBody().charStream())
если вы все еще используете javaЯ столкнулся с той же проблемой. Я решил это дооснащением. Позвольте мне показать это ...
Если ваша структура ошибки JSON похожа на
И это мой класс статуса ошибки
Теперь нам нужен класс, который может обрабатывать наш json.
Теперь мы можем проверить наш ответ в вызове retrofit api
Вот и все, теперь вы можете показать свой тост
источник
Вот элегантное решение с использованием
Kotlin
расширений:и использование:
showError(retrofitThrowable.getApiError()?.message)
источник
Таким образом, вам не нужен экземпляр Retrofit, если вы вводите только услугу, созданную из Retrofit.
Используйте это так:
источник
Прочтите errorBody в String и вручную проанализируйте json.
источник
Кажется, это проблема, когда вы используете OkHttp вместе с Retrofit, поэтому вы можете либо удалить OkHttp, либо использовать код ниже, чтобы получить тело ошибки:
источник
решил это:
источник
JacksonConverterFactory
наGsonConverterFactory
Он преобразует json в мой настраиваемый объект, но выдает предупреждение Unchecked cast retrofit.Converter <capture <? >>источник
В Котлине:
источник
Значения errorBody должны устанавливать объект APIError в Retrofit. Таким образом, вы можете использовать приведенную ниже структуру кода.
источник
Проверено и работает
источник
источник