web-dev-qa-db-fra.com

Comment obtenir les codes de statut de réponse de réussite de Retrofit

Je ne parviens pas à obtenir le code d'état de la réponse de la réponse comme 200,201, etc. Comme nous pouvons facilement obtenir des codes d'erreur de la classe RetrofitError comme error.isNetworkError() et error.getResponse().getStatus(). Existe-t-il une solution de contournement pour obtenir des codes d'état?

44
Adarsh Yadav

Selon Retrofit 2.0.2, l'appel est maintenant

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

J'espère que ça aide quelqu'un :-)

EDIT: De nombreuses applications pourraient également tirer parti de la vérification du succès (code de réponse 200-300) dans une clause, puis de la gestion des erreurs dans les autres clauses, telles que 201 (créé) et 202 (accepté) conduire à la même logique d'application que 200 dans la plupart des cas.

@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
    }
}
73
jhm

vous pouvez obtenir le code de statut en cas de succès, comme vous le faites dans failure()

   @Override
                public void success(Object object, Response response) {

                   response.getStatus()//returns status code integer
                }

puisque vous avez Response objet dans le rappel de succès comme response.getStatus()

[~ # ~] éditer [~ # ~]

Je suppose que vous utilisez okhttp avec retrofit. ok http a un outil puissant appelé Interceptor

vous pouvez intercepter la réponse avant la modification de Callback et obtenir le code d'état de la réponse comme ceci:

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

pour en savoir plus sur les intercepteurs, visitez ici .

16
Ercan

je l'ai réalisé en suivant les codes:

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) {

    }
}

Lorsque l'api restante renvoie 400, etc., la méthode onFailure est appelée par défaut. Si vous voulez faire quelque chose avec succès: (quand retourne 200, etc.)

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