Как получить коды состояния ответа на успешное переоборудование

Я не могу получить код состояния успешного ответа из ответа, например, 200,201 .. и т. Д. Поскольку мы можем легко получить коды ошибок из класса RetrofitError, например error.isNetworkError() и error.getResponse().getStatus(). Есть ли обходной путь для получения кодов состояния?


person Adarsh Yadav    schedule 04.08.2015    source источник


Ответы (3)


Согласно Retrofit 2.0.2, звонок сейчас

@Override
public void onResponse(Call<YourModel> call, Response<YourModel> response) {
    if (response.code() == 200) {
       // Do awesome stuff
    } else {
       // Handle other response codes
    }
}

Надеюсь, это кому-то поможет :-)

РЕДАКТИРОВАТЬ: многим приложениям также может быть полезна простая проверка успеха (код ответа 200–300) в одном предложении, а затем обработка ошибок в других пунктах, например 201 (Создано) и 202 (Принято), вероятно, в большинстве случаев приводят к той же логике приложения, что и 200.

@Override
public void onResponse(Call<YourModel> call, Response<YourModel> response) {
    if (response.isSuccessful()) {
       // Do awesome stuff
    } else if (response.code() == 401) {
       // Handle unauthorized
    } else {
       // Handle other responses
    }
}
person jhm    schedule 31.05.2016
comment
response.code == 401 должно быть response.code() == 401. - person Ugurcan Yildirim; 31.10.2016
comment
какой класс я должен переопределить? - person Junior Frogie; 18.04.2018
comment
В каком классе я должен писать этот метод? - person Karan Sharma; 09.08.2019
comment
Может кто-нибудь ответить на вопрос @KaranSharma, я тоже запутался ... Моя структура выглядит так: Сервис - ›Источник данных -› Репозиторий - ›ViewModel -› Фрагмент - person SKREFI; 04.03.2021

Вы можете получить код состояния в success() так же, как в failure()

@Override
public void success(Object object, Response response) {
    response.getStatus() // returns status code integer
}

Поскольку у вас есть объект Response в успешном обратном вызове как response.getStatus()

ИЗМЕНИТЬ

Я предполагаю, что вы используете okhttp с модернизацией.

okhttp имеет мощный инструмент под названием Interceptor

Вы можете поймать ответ до модификации Callback и получить код состояния из ответа:

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new  Interceptor(){
    @Override 
    public Response intercept(Chain chain) throws IOException{

    Request request = chain.request();
    Response response = chain.proceed(request);
    response.code()//status code
    return response;

});

// then add it to you Restclient like this:
restAdapter = new RestAdapter.Builder()
                .setEndpoint(URL_SERVER_ROOT)
                .setClient(new OkClient(client))  //plus your configurations       
                .build();

Чтобы узнать больше о перехватчиках, посетите здесь.

person Ercan    schedule 04.08.2015
comment
Я не нашел ни одной функции response.getStatus (). Я использую дооснащение 1.9.0, какую версию вы используете? - person Adarsh Yadav; 04.08.2015
comment
Я тоже использую 1.9.0. вы используете интерфейс обратного вызова? - person Ercan; 04.08.2015
comment
Да, но согласно square.github.io/retrofit/javadoc/retrofit/Callback .html у нас есть два обратных вызова: успешный и неудачный. Согласно определению, которое у нас есть, мы получим неуспешный HTTP-ответ из-за сбоя сети, кода состояния, отличного от 2XX, или неожиданного исключения из-за сбоя, но только Успешный HTTP-ответ в случае успеха. - person Adarsh Yadav; 04.08.2015
comment
ах, извините, я не правильно понял вопрос, я думаю. сейчас я отредактирую свой ответ - person Ercan; 04.08.2015
comment
Да, на самом деле, как и код состояния отказа, мне нужны коды состояния успеха для выполнения некоторых операций на их основе. С другой стороны, спасибо, что потратили на это время. - person Adarsh Yadav; 04.08.2015
comment
Но я почти уверен, что успешный обратный вызов имеет 2 параметра. Первый - ваш тип. Второй - это ответ, как сказано в документации: успех (T t, ответ ответа) - person Ercan; 04.08.2015
comment
Есть ли полное руководство по использованию перехватчика Okhttp? - person Adarsh Yadav; 04.08.2015
comment
@AdarshYadav снова прочел эту документацию. в случае успеха вы действительно получаете объект Response, который содержит то, о чем вы просите. - person njzk2; 04.08.2015
comment
T - это то, о чем вы просили, Response такой же, как RetrofitError.getResponse. в объекте ответа у вас есть код состояния. пожалуйста, попробуйте использовать его, я уверен, что использую его в своем коде. - person Ercan; 04.08.2015
comment
@Ercan: приведенный выше код работает для меня, теперь я могу получить код состояния, но теперь мое приложение начинает давать сбой. Retrofit ﹕ java.lang.IllegalArgumentException: метод POST должен иметь тело запроса. Я использую следующие комбинации compile'com.squareup.retrofit: retrofit: 1.9.0 'compile' com.squareup.okhttp: okhttp: 2.4.0 'compile' com.squareup.okhttp: okhttp-urlconnection: 2.4.0 'compile com.squareup.picasso: picasso: 2.5.0. Связана ли эта проблема с разными версиями. - person Adarsh Yadav; 05.08.2015
comment
Я не уверен, что @AdarshYadav мне кажется, что это еще один вопрос. В нем четко указано, что метод post не имеет тела. Проверьте название вашего метода обслуживания и запрос. используйте restClient в режиме полного журнала. Я надеюсь, это поможет вам. - person Ercan; 05.08.2015
comment
Я исправил это, уменьшив количество версий, чтобы скомпилировать com.squareup.okhttp: okhttp: 2.2.0 и скомпилировать com.squareup.okhttp: okhttp-urlconnection: 2.2.0. Спасибо за ваши усилия. - person Adarsh Yadav; 05.08.2015
comment
RestAdapter устарел - person stevebaros; 30.12.2019
comment
@stevebaros, этому ответу уже почти 5 лет. - person Ercan; 03.01.2020

Я добился этого с помощью следующих кодов:

public abstract class BaseCallBack<T> {

    public abstract void onSuccess(Response<T> response);
    public abstract void onFailure(Response<T> response);
}

public abstract class SuccessCallback<T> extends BaseCallBack<T> implements Callback<T>{


    @Override
    public void onResponse(Call<T> call, Response<T> response) {

        if(response.code()>= 400 && response.code() < 599){
             onFailure(response);
        }
        else {
            onSuccess(response);
        }

    }

    @Override
    public void onFailure(Call<T> call, Throwable t){

    }

    @Override
    public void onSuccess(Response<T> response) {

    }

    @Override
    public void onFailure(Response<T> response) {

    }
}

Когда остальные api вернут 400 и т. Д., По умолчанию будет вызываться метод onFailure. Если вы хотите что-то сделать при успехе: (когда возвращается 200 и т. Д.)

 ServiceConnector.api.getHomePage().enqueue(new SuccessCallback<Void>() {
        @Override
        public void onSuccess(Response<Void> response) {
            super.onSuccess(response);
        }
    });
person Ali Gürelli    schedule 23.06.2016