Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Десериализация ошибок HTTP 400 с Retrofit 2.0.0-beta1 в Java

Быстрый ответ

Десериализацию тела ошибки в Retrofit 2.0 можно выполнить так, чтобы получить пользовательскую модель ошибки. В Java код для этого будет выглядеть так:

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.

Кинга Идем в IT: пошаговый план для смены профессии

Продвинутые способы обработки ошибок

В процессе разработки часто встречаются ситуации, когда вам требуется реализовать сложную логику обработки ошибок API, расширяющую и детализирующую информацию о произошедшей проблеме.

Индивидуальное тело ошибки для каждого кода ответа

Вы можете обрабатывать разные типы ошибок в зависимости от кода HTTP-ответа, проверив десериализованный объект ошибки:

Java
Скопировать код
if (apiError != null && apiError.getStatus() == HttpStatus.UNAUTHORIZED.value()) {
    // Обработайте ошибку 401 – Unauthorized.
}
Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Пользовательские классы для управления ошибками

Вы можете создать классы, которые детализируют информацию об ошибках, для улучшения структурированности процесса их обработки, например:

Java
Скопировать код
public class MyErrorMessage {
    private String message;
    private int code;

    public static MyErrorMessage parseError(ResponseBody errorBody) {
        // Реализация десериализации тела ошибки.
    }

    // Геттеры для полей класса.
}

Использование новых возможностей Retrofit для обработки ошибок

Retrofit, начиная с версии 2.5.0, предлагает механизмы для улучшения обработки ошибок:

Java
Скопировать код
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());
}

Визуализация

Представим процесс обработки ошибок как декодирование тайнописи:

Markdown
Скопировать код
Ответ API: 📩 (Тайнопись)
Желаемый результат: 📘 (Расшифрованное сообщение об ошибке)

Применим конвертер Retrofit:

Java
Скопировать код
Retrofit retrofit = new Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .build();

BookOfErrors errors = retrofit.responseBodyConverter(BookOfErrors.class, new Annotation[0])
    .convert(response.errorBody());

Таким образом, мы преобразуем неясное сообщение об ошибке в текст, понятный человеку:

Markdown
Скопировать код
До: 📩 (Тайнопись) 
После: 📘 (Понятный текст)

Освоение обработки ошибок в Retrofit

Изучение различных способов обработки ошибок в Retrofit значительно облегчит эту задачу:

Избегаем проблем с пустым errorBody

Чтобы исключить потерю данных из errorBody, сохраните его содержимое в строку:

Java
Скопировать код
String errorString = null;
if (response.errorBody() != null) {
    errorString = response.errorBody().string();
}

Синхронизация обработки ошибок

Создавайте методы, которые эффективно обрабатывают ошибки в асинхронных и синхронных запросах:

Java
Скопировать код
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:

Java
Скопировать код
try {
    Response<MyApiResponse> response = call.execute();
    if (!response.isSuccessful()) {
        // Обработка ошибки из ответа API.
    }
} catch (IOException e) {
    // Обработка сетевых ошибок.
}

Использование конвертеров

Переведите JSON-ответы API в объекты Java, используя конвертеры, такие как GsonConverterFactory:

Следите за обновлениями библиотеки Retrofit, чтобы осваивать наиболее актуальные доступные функции и совершенствовать навыки обработки ошибок.

Полезные материалы

  1. Retrofit 2 — Простая обработка ошибок — базовые принципы обработки ошибок с использованием Retrofit.
  2. Официальная документация Retrofit — детальное руководство по работе с Retrofit.
  3. HttpException (Retrofit API) — разъяснения работы с HTTP-ответами в Retrofit.
  4. Consuming APIs with Retrofit | CodePath Android Cliffnotes — полезное руководство по работе с API и обработке ошибок в Retrofit.
  5. Call Adapters · square/retrofit Wiki · GitHub — обсуждение механизмов вызова в Retrofit.
  6. Medium: Обработка ошибок с использованием Retrofit 2 — анализ различных методов обработки ошибок при работе с Retrofit.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как выполнить десериализацию ошибки HTTP 400 в Retrofit?
1 / 5
Свежие материалы