Десериализация ошибок HTTP 400 с Retrofit 2.0.0-beta1 в Java
Быстрый ответ
Десериализацию тела ошибки в Retrofit 2.0 можно выполнить так, чтобы получить пользовательскую модель ошибки. В Java код для этого будет выглядеть так:
ApiError apiError = null;
if (!response.isSuccessful() && response.errorBody() != null) {
apiError = retrofit.responseBodyConverter(ApiError.class, new Annotation[0])
.convert(response.errorBody());
}
Этот блок кода следует вставить в метод обработки ответа Retrofit. Вам также потребуется создать класс ApiError
, структура которого должна соответствовать структуре JSON-ошибки вашего API.
Продвинутые способы обработки ошибок
В процессе разработки часто встречаются ситуации, когда вам требуется реализовать сложную логику обработки ошибок API, расширяющую и детализирующую информацию о произошедшей проблеме.
Индивидуальное тело ошибки для каждого кода ответа
Вы можете обрабатывать разные типы ошибок в зависимости от кода HTTP-ответа, проверив десериализованный объект ошибки:
if (apiError != null && apiError.getStatus() == HttpStatus.UNAUTHORIZED.value()) {
// Обработайте ошибку 401 – Unauthorized.
}
Пользовательские классы для управления ошибками
Вы можете создать классы, которые детализируют информацию об ошибках, для улучшения структурированности процесса их обработки, например:
public class MyErrorMessage {
private String message;
private int code;
public static MyErrorMessage parseError(ResponseBody errorBody) {
// Реализация десериализации тела ошибки.
}
// Геттеры для полей класса.
}
Использование новых возможностей Retrofit для обработки ошибок
Retrofit, начиная с версии 2.5.0, предлагает механизмы для улучшения обработки ошибок:
Retrofit retrofit = getRetrofitInstance();
MyErrorMessage errorMessage = null;
if (!response.isSuccessful()) {
Converter<ResponseBody, MyErrorMessage> converter =
retrofit.responseBodyConverter(MyErrorMessage.class, new Annotation[0]);
errorMessage = converter.convert(response.errorBody());
}
Визуализация
Представим процесс обработки ошибок как декодирование тайнописи:
Ответ API: 📩 (Тайнопись)
Желаемый результат: 📘 (Расшифрованное сообщение об ошибке)
Применим конвертер Retrofit:
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.build();
BookOfErrors errors = retrofit.responseBodyConverter(BookOfErrors.class, new Annotation[0])
.convert(response.errorBody());
Таким образом, мы преобразуем неясное сообщение об ошибке в текст, понятный человеку:
До: 📩 (Тайнопись)
После: 📘 (Понятный текст)
Освоение обработки ошибок в Retrofit
Изучение различных способов обработки ошибок в Retrofit значительно облегчит эту задачу:
Избегаем проблем с пустым errorBody
Чтобы исключить потерю данных из errorBody
, сохраните его содержимое в строку:
String errorString = null;
if (response.errorBody() != null) {
errorString = response.errorBody().string();
}
Синхронизация обработки ошибок
Создавайте методы, которые эффективно обрабатывают ошибки в асинхронных и синхронных запросах:
call.enqueue(new Callback<MyApiResponse>() {
@Override
public void onResponse(Call<MyApiResponse> call, Response<MyApiResponse> response) {
// Обработка ошибки из ответа API.
}
@Override
public void onFailure(Call<MyApiResponse> call, Throwable t) {
// Обработка сетевых ошибок.
}
});
В синхронных запросах используйте блок try-catch:
try {
Response<MyApiResponse> response = call.execute();
if (!response.isSuccessful()) {
// Обработка ошибки из ответа API.
}
} catch (IOException e) {
// Обработка сетевых ошибок.
}
Использование конвертеров
Переведите JSON-ответы API в объекты Java, используя конвертеры, такие как GsonConverterFactory
:
Следите за обновлениями библиотеки Retrofit, чтобы осваивать наиболее актуальные доступные функции и совершенствовать навыки обработки ошибок.
Полезные материалы
- Retrofit 2 — Простая обработка ошибок — базовые принципы обработки ошибок с использованием Retrofit.
- Официальная документация Retrofit — детальное руководство по работе с Retrofit.
- HttpException (Retrofit API) — разъяснения работы с HTTP-ответами в Retrofit.
- Consuming APIs with Retrofit | CodePath Android Cliffnotes — полезное руководство по работе с API и обработке ошибок в Retrofit.
- Call Adapters · square/retrofit Wiki · GitHub — обсуждение механизмов вызова в Retrofit.
- Medium: Обработка ошибок с использованием Retrofit 2 — анализ различных методов обработки ошибок при работе с Retrofit.