studio library example android retrofit okhttp

android - library - Retrofit-interceptar respuestas globalmente



retrofit post (3)

Otra posibilidad es anular el método de execute en el OkClient de OkClient . En mi caso, estaba buscando un encabezado de respuesta específico, por lo que fue algo como esto:

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

Me gustaría interceptar todas las respuestas recibidas por el motor de actualización y buscar el código de error HTTP, por ejemplo el error 403.

Soy consciente de que puedo usar la devolución de llamada de error (error RetrofitError) de cada solicitud y comprobar si hay 403, pero me gustaría ajustar la respuesta globalmente.

Puedo ver que la intercepción de solicitud es posible, pero no veo una opción similar para la respuesta.

¿Alguna sugerencia?


Pude lograr eso al agregar un interceptor al OkHttpClient que usa la modificación.

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

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


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

Como se puede ver en el fragmento de okhttp3.Response response = chain.proceed(request); anterior, la okhttp3.Response response = chain.proceed(request); La línea accede a la respuesta del servidor. Por consiguiente, podemos verificar el código de estado con if (response.code() == 500) y luego abrir ServerIsBrokenActivity .