Retrofit – Interceptar respuestas globalmente
Quisiera interceptar todas las respuestas recibidas por el motor del retrofit, y exploración para el código de error del HTTP, por ejemplo error 403.
Soy consciente de que puedo usar el fallo (RetrofitError error) callback de cada solicitud y comprobar si hay 403 pero me gustaría envolver la respuesta globalmente.
- SocketTimeoutException actualización de Android
- Retrofit - Demasiadas solicitudes de seguimiento: 21
- OkHttp cuerpo del poste del gzip
- Respuesta de lectura por push de servidor con OkHttp
- Retrofit 2 / OkHttp: Cancelar todas las solicitudes en ejecución
Puedo ver que la intercepción de la petición es posible, pero no veo una opción similar para la respuesta.
¿Alguna sugerencia?
- El resorte de solicitud de varias partes no enlaza datos de archivo
- Confiando en todos los certificados con okHttp
- ProGuard no funciona con okhttp
- Proxy transparente para probar las respuestas del servidor sin conexión en Android
- Cómo convertir la respuesta de Okhttp en inputstream
- Conexión de http de Android con OkHttp No funciona
- Cómo agregar cabeceras a interceptor de solicitud OkHttp?
- Obtención de solicitud de contenido corporal mediante el método POST de Retrofit 2.0
Yo era capaz de lograr que mediante la adición de un interceptor para el OkHttpClient que retrofit está utilizando.
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) { doStuff(); } 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));
Otra posibilidad es anular el método execute
en el OkClient
de OkClient
. En mi caso estaba buscando una cabecera de respuesta específica, 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);