Я не могу получить код состояния успешного ответа из ответа, например, 200,201 .. и т. Д. Поскольку мы можем легко получить коды ошибок из класса RetrofitError
, например error.isNetworkError()
и error.getResponse().getStatus()
. Есть ли обходной путь для получения кодов состояния?
Как получить коды состояния ответа на успешное переоборудование
Ответы (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
}
}
response.code == 401
должно быть response.code() == 401
.
- person Ugurcan Yildirim; 31.10.2016
Вы можете получить код состояния в 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();
Чтобы узнать больше о перехватчиках, посетите здесь.
Я добился этого с помощью следующих кодов:
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);
}
});