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

Как получить тело ответа для переопределения исключения?

Я пытаюсь подключиться к сервису отдыха через модификацию в приложении 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. Я не знаю почему? Должен ли я установить что-то с адаптером отдыха, чтобы ответ был передан для объекта с измененной ошибкой.

4b9b3361

Ответ 1

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

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

с Дооснащение 2.0

@Override
public void onFailure(Call<Example> call, Throwable t) {
    String message = t.getMessage();
    Log.d("failure", message);
}

Ответ 2

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

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);
}

Ответ 3

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

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

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

public void failure(RetrofitError error) {
    Log.v(TAG, error.getMessage());
};

Ответ 4

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

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

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