Как получить тело ответа на исключение модификации?

Я пытаюсь подключиться к сервису отдыха через дооснащение в приложении для Android. Я получаю ответы. Но когда от службы поступает сообщение об ошибке, возникает исключение преобразования, и теперь я хочу выполнить некоторые действия на основе тела ответа. Но я получаю тело ответа как NULL. Но в журнале модернизации есть сообщение об ошибке. Почему это происходит.

D/Reftofit log(24856): OkHttp-Received-Millis: 1397527055676
D/Reftofit log(24856): OkHttp-Response-Source: NETWORK 200
D/Reftofit log(24856): OkHttp-Sent-Millis: 1397527055492
D/Reftofit log(24856): Server: Apache/2.2.22 (Ubuntu)
D/Reftofit log(24856): X-Powered-By: PHP/5.3.10-1ubuntu3.10
D/Reftofit log(24856): {"result":"Invalid Token ID"}

Код:

public void failure(RetrofitError retrofitError) {
    String response = null;
    TokenError tokenError = (TokenError) retrofitError.getBodyAs(TokenError.class);
    response = tokenError.getErrorDetails();
    Log.e(TAG, response);
    if (response != null && response.contains("Invalid Token ID")) {
        GroupDataProvider.getInstance().onFailure();
    }

}

Здесь я получаю tokenError как null. Я не знаю почему? Нужно ли мне что-то настраивать с помощью адаптера rest, чтобы ответ был передан на объект ошибки модификации.


person Satya Swaroop Boddu    schedule 15.04.2014    source источник


Ответы (4)


Попробуйте этот код:

@Override
public void failure(RetrofitError error) {
    String json =  new String(((TypedByteArray)error.getResponse().getBody()).getBytes());
    Log.v("failure", json.toString());
}

с Retrofit 2.0

@Override
public void onFailure(Call<Example> call, Throwable t) {
    String message = t.getMessage();
    Log.d("failure", message);
}
person Cabezas    schedule 20.09.2014
comment
Просто и удивительно. Эта строка сохранила полный класс. - person Chrishan; 22.10.2015
comment
что такое класс RestError? я не могу импортировать это - person John; 07.07.2016
comment
@Cabezas Будьте осторожны с первым примером подхода (Retrofit 1.9), так как при приведении к TypedByteArray возникает ошибка, если вы используете LogLevel.NONE. См. github.com/square/retrofit/issues/953. - person fernandospr; 01.08.2016

если ошибка в строковом формате:

public Sring getErrorBodyAsString(RetrofitError error) {    
      return (String) error.getBodyAs(String.class)
}

если вам нужен нестандартный объект:

class ErrorResponse {
   @SerializedName("error")
   int errorCode;

   @SerializedName("msg")
   String msg;
}

public T getErrorBody(RetrofitError error, Class<T> clazz) {    
      return (T) error.getBodyAs(clazz);
}
person Victor Ponomarenko    schedule 07.12.2015

Ваш сервер должен вернуть код ошибки HTTP 4xx, чтобы это заработало.

Когда ваш сервер возвращает HTTP 200, это означает успешный ответ, и он будет обработан веткой onSuccess. Вероятно, ваш объект, который вы передаете Callback<Object>, должен быть готов обработать как успешный результат, так и результат ошибки.

Чтобы убедиться в этом, вы можете проверить, действительно ли RetrofitError JsonParseException, добавив следующий фрагмент:

public void failure(RetrofitError error) {
    Log.v(TAG, error.getMessage());
};
person Sergii Pechenizkyi    schedule 15.04.2014
comment
error.getMessage() не возвращает тело, отправленное службой REST, а возвращает что-то вроде 406 Not Acceptable (если вы получили 406). См. Ответ Кабезаса, чтобы получить тело. - person Ferran Maylinch; 22.01.2016

для этого вам нужно использовать getErrorStream ().

Если ответ HTTP указывает, что произошла ошибка, getInputStream () выдаст исключение IOException. Используйте getErrorStream (), чтобы прочитать ответ об ошибке. Заголовки можно прочитать обычным способом, используя getHeaderFields ().

Ссылка: проблема с github

person LOG_TAG    schedule 23.04.2014