Agregar cabecera a todas las solicitudes con Retrofit 2
La documentación de Retrofit 2 dice:
Los encabezados que se deben agregar a cada solicitud se pueden especificar usando un interceptor OkHttp.
Se puede hacer fácilmente usando la versión anterior, aquí está el QA relacionado.
Pero utilizando retrofit 2, no pude encontrar algo como setRequestInterceptor
o método setInterceptor
que se puede aplicar al objeto Retrofit.Builder
.
También parece que no hay RequestInterceptor en OkHttp más. El documento de Retrofit nos remite a Interceptor que no entendía cómo usarlo para este propósito.
¿Cómo puedo hacer esto?
- Retrofit + RxJava no puede almacenar en caché las respuestas, los encabezados de respuesta sospechados
- Manera correcta de manejar ninguna red con Retrofit y RX-java
- ¿Cómo puede Retrofit 2.0 analizar objeto JSON anidado?
- Utilice JsonReader.setLenient (true) para aceptar JSON malformado en la línea 1 de la columna 1 path $
- No vuelva a ejecutar la llamada de Retrofit si todavía está en curso con RxJava 2
- POST con Android Retrofit
- Primavera Android Vs Retrofit
- ¿Cómo aumentar el tiempo de espera para las solicitudes de reacondicionamiento en robospice android?
OkHttpClient httpClient = new OkHttpClient(); httpClient.addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request().newBuilder().addHeader("parameter", "value").build(); return chain.proceed(request); } }); Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(url).client(httpClient).build();
La última versión de actualización AQUÍ -> 2.1.0.
Lambda versión:
builder.addInterceptor(chain -> { Request request = chain.request().newBuilder().addHeader("key", "value").build(); return chain.proceed(request); });
Fea versión larga:
builder.addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request().newBuilder().addHeader("key", "value").build(); return chain.proceed(request); } });
versión completa:
class Factory { public static APIService create(Context context) { OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); builder.readTimeout(10, TimeUnit.SECONDS); builder.connectTimeout(5, TimeUnit.SECONDS); if (BuildConfig.DEBUG) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); builder.addInterceptor(interceptor); } builder.addInterceptor(chain -> { Request request = chain.request().newBuilder().addHeader("key", "value").build(); return chain.proceed(request); }); builder.addInterceptor(new UnauthorisedInterceptor(context)); OkHttpClient client = builder.build(); Retrofit retrofit = new Retrofit.Builder().baseUrl(APIService.ENDPOINT).client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); return retrofit.create(APIService.class); } }
Gradle (necesita agregar el interceptor de registro si va a usarlo):
//----- Retrofit compile 'com.squareup.retrofit2:retrofit:2.1.0' compile "com.squareup.retrofit2:converter-gson:2.1.0" compile "com.squareup.retrofit2:adapter-rxjava:2.1.0" compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'
Para el registro de su solicitud y la respuesta que necesita un interceptor y también para la configuración de la cabecera que necesita un interceptor, He aquí la solución para agregar el interceptor a la vez utilizando retrofit 2.1
public OkHttpClient getHeader(final String authorizationValue ) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient okClient = new OkHttpClient.Builder() .addInterceptor(interceptor) .addNetworkInterceptor( new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request request = null; if (authorizationValue != null) { Log.d("--Authorization-- ", authorizationValue); Request original = chain.request(); // Request customization: add request headers Request.Builder requestBuilder = original.newBuilder() .addHeader("Authorization", authorizationValue); request = requestBuilder.build(); } return chain.proceed(request); } }) .build(); return okClient; }
Ahora en su objeto de modernización agregue este encabezado en el cliente
Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .client(getHeader(authorizationValue)) .addConverterFactory(GsonConverterFactory.create()) .build();
En mi caso addInterceptor()
no funcionó para añadir encabezados HTTP a mi solicitud, tuve que usar addNetworkInterceptor()
. El código es el siguiente:
OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); httpClient.addNetworkInterceptor(new AddHeaderInterceptor());
Y el código del interceptor:
public class AddHeaderInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request.Builder builder = chain.request().newBuilder(); builder.addHeader("Authorization", "MyauthHeaderContent"); return chain.proceed(builder.build()); } }
Este y más ejemplos sobre este tema
Si utiliza el método addInterceptor para agregar HttpLoggingInterceptor, no registrará las cosas agregadas por otros interceptores aplicadas después de HttpLoggingInterceptor.
Por ejemplo: Si tiene dos interceptores "HttpLoggingInterceptor" y "AuthInterceptor", y HttpLoggingInterceptor aplicado primero, entonces no puede ver los http-params o los encabezados que establecen AuthInterceptor.
OkHttpClient.Builder builder = new OkHttpClient.Builder() .addNetworkInterceptor(logging) .addInterceptor(new AuthInterceptor());
Lo solucioné usando el método addNetworkInterceptor.
- ¿Es Secure.ANDROID_ID único para cada dispositivo?
- \ Build \ intermedios \ res \ recursos-anzhi-debug-stripped.ap_ 'especificado para la propiedad' resourceFile 'no existe