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

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

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

Десериализацию тела ошибки в 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.
}

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

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

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.
Свежие материалы