Retrofit-intercepter les réponses à l'échelle mondiale

Je voudrais intercepter toutes les réponses reçues par le moteur de modification, et rechercher le code D'erreur HTTP, par exemple l'erreur 403.

Je suis conscient que je peux utiliser le rappel d'échec(erreur RetrofitError) de chaque requête et vérifier les 403, mais je voudrais envelopper la réponse globalement.

Je peux voir que l'interception de requête est possible, mais je ne vois pas une option similaire pour la réponse.

Des suggestions?

23
demandé sur Petter Hesselberg 2015-08-30 11:12:45

3 réponses

J'ai pu accomplir cela en ajoutant un intercepteur à L'okhttpclient que retrofit utilise.

Retrofix 2.x:

   OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
   clientBuilder.
            addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                   Request request = chain.request();
                   Response response = chain.proceed(request);
                   if (response.code() == 403) {
                         handleForbiddenResponse();
                   }
                   return response;
                }
            });


    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(clientBuilder.build();)
            .build();

Adaptation 1.x:

public class ForbiddenInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        if (response.code() == 403) {
             handleForbiddenResponse();
        }
        return response;
    }
}



OkHttpClient okHttpClient = Utils.createUnsafeOkHttpClient();
okHttpClient.interceptors().add(new ForbiddenInterceptor());

RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
        .setEndpoint(API_BASE_URL)
        .setClient(new OkClient(okHttpClient));
56
répondu aviran 2017-11-15 14:07:55

Une autre possibilité est de remplacer la méthode execute dans OkClient de Retrofit. Dans mon cas, je cherchais un en-tête de réponse spécifique, donc il est allé quelque chose comme ceci:

OkClient client = new OkClient(okHttpClient) {
    @Override
    public retrofit.client.Response execute(retrofit.client.Request request) throws IOException {
        retrofit.client.Response response = super.execute(request);

        // Do whatever with 'response', such as looking for the value of a particular header:

        List<retrofit.client.Header> headers = response.getHeaders();
        for (retrofit.client.Header header : headers) {
            if (MY_HEADER.equalsIgnoreCase(header.getName())) {
                this.savedValue = header.getValue();
                break;
            }
        }

        return response;
    }
};

RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
        .setEndpoint(API_BASE_URL)
        .setClient(client);
0
répondu Petter Hesselberg 2017-05-23 11:05:39
OkHttpClient okHttpClient = new OkHttpClient.Builder()  
    .addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            okhttp3.Response response = chain.proceed(request);

            // todo deal with the issues the way you need to
            if (response.code() == 500) {
                startActivity(
                        new Intent(
                                ErrorHandlingActivity.this,
                                ServerIsBrokenActivity.class
                        )
                );

                return response;
            }

            return response;
        }
    })
    .build();

Retrofit.Builder builder = new Retrofit.Builder()  
        .baseUrl("http://your_url")
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build(); 

Comme vous pouvez le voir dans l'extrait ci-dessus, la ligne okhttp3.Response response = chain.proceed(request); accède à la réponse du serveur. Par conséquent, nous pouvons vérifier le code d'état avec if (response.code() == 500) et ensuite ouvrir le ServerIsBrokenActivity.

0
répondu Faxriddin Abdullayev 2018-05-14 05:17:03