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?

 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.

  • Problemas al integrar el convertidor Simple XML en retrofit para Android
  • Cómo manejar el `IllegalArgumentException` en RxJava?
  • Renovar 2 verifica la URL de la llamada
  • No se puede verificar la llamada de método de simulación desde el suscriptor de RxJava
  • Realm + Retrofit + Rxjava
  • Prueba de respuestas reales de red con retroadaptación
  • Prueba de unidad de Android con Retrofit y Mockito
  • ProGuard no funciona con okhttp
  • RxJava dividir uno Observable a dos subObservables
  • Javax.net.ssl.SSLHandshakeException: Handshake falló en Android 5.0.0 cuando SSLv2 y SSlv3 están deshabilitados (sólo TLS) (y mayores)
  • Establecer Retrofit RestAdapter.LogLevel a algo que no sea FULL produce un cuerpo de respuesta vacía
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.