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

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

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

4b9b3361

Ответ 1

В соответствии с 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
    }
}

Ответ 2

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

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

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

EDIT

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

У ohttp есть мощный инструмент под названием 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();

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

Ответ 3

i достиг его следующих кодов:

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