Подтвердить что ты не робот

Как получить тело Response при возникновении ошибки при использовании Retrofit 2.0 Observables

Я использую Retrofit 2.0, чтобы сделать api-вызовы, возвращающие Observables. Все работает хорошо, когда звонок прошел через штраф, и ответ такой, как ожидалось. Теперь позвольте сказать, что у нас есть ответ об ошибке, он бросает onError. Я хотел бы прочитать тело ответа, даже если это ошибка.

Пример

@FormUrlEncoded
@POST("tokenLogin")
Observable<LoginResponse> loginWithToken(
        @Field("token") String pin
);

Когда запрос и ответ действительны, я получаю правильный наблюдаемый, и onError вызывается как ожидается, когда есть ошибка.

Правильный ответ:

{ "status" : "authenticated" }

Наблюдаемый преобразует это в правое Наблюдаемое, и я могу прочитать ответ как объект LoginResponse.

Теперь ответ об ошибке выглядит следующим образом:

{ "errorMessage" : "You need to take some xyz action" }

Я хотел бы прочитать этот ответ об ошибке и отобразить сообщение пользователю. Как мне это сделать?

4b9b3361

Ответ 1

Просто проверьте, является ли throwable экземпляром HttpException, а затем вы можете получить доступ к доработанному отклику

if (e instanceof HttpException) {
    ResponseBody body = ((HttpException) e).response().errorBody();
    ...
}

Затем вы можете использовать конвертер для десериализации его (или сделать это самостоятельно).

Ответ 2

Вы можете добавить этот блок кода, чтобы отобразить сообщение об ошибке.

@Override
public void onFailure(Throwable t) {

 if (t instanceof HttpException) {
        ResponseBody body = ((HttpException) t).response().errorBody();
        Gson gson = new Gson();
        TypeAdapter<ErrorParser> adapter = gson.getAdapter
                (ErrorParser
                        .class);
        try {
            ErrorParser errorParser =
                    adapter.fromJson(body.string());

            Logger.i(TAG, "Error:" + errorParser.getError());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}