Как получить тело 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" }
Я хотел бы прочитать этот ответ об ошибке и отобразить сообщение пользователю. Как мне это сделать?
Ответы
Ответ 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();
}
}
}