Ajout d’en-tête à toutes les demandes avec Retrofit 2

La documentation de Retrofit 2 dit:

Les en-têtes à append à chaque requête peuvent être spécifiés à l’aide d’un intercepteur OkHttp.

Cela peut être fait facilement en utilisant la version précédente, voici le QA associé.

Mais avec retrofit 2, je n’ai pas pu trouver quelque chose comme la méthode setRequestInterceptor ou setInterceptor qui peut être appliquée à l’object Retrofit.Builder .

En outre, il semble qu’il n’y ait plus de RequestInterceptor dans OkHttp . Le doc de Retrofit nous renvoie à Interceptor que je n’ai pas bien compris comment l’utiliser à cette fin.

Comment puis-je faire ceci?

 OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 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()).build(); 

La dernière version de rénovation ICI -> 2.1.0.

version lambda:

  builder.addInterceptor(chain -> { Request request = chain.request().newBuilder().addHeader("key", "value").build(); return chain.proceed(request); }); 

version longue moche:

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

version complète:

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

classer le fichier (vous devez append l’intercepteur de journalisation si vous prévoyez de l’utiliser):

  //----- Retrofit comstack 'com.squareup.retrofit2:retrofit:2.1.0' comstack "com.squareup.retrofit2:converter-gson:2.1.0" comstack "com.squareup.retrofit2:adapter-rxjava:2.1.0" comstack 'com.squareup.okhttp3:logging-interceptor:3.4.0' 

Pour enregistrer votre demande et votre réponse, vous avez besoin d’un intercepteur et également pour définir l’en-tête, vous avez besoin d’un intercepteur. Voici la solution pour append à la fois l’intercepteur à la fois en utilisant la conversion 2.1

  public OkHttpClient getHeader(final Ssortingng 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; } 

Maintenant, dans votre object de modification, ajoutez cet en-tête au client

 Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .client(getHeader(authorizationValue)) .addConverterFactory(GsonConverterFactory.create()) .build(); 

Dans mon cas, addInterceptor() n’a pas fonctionné pour append des en-têtes HTTP à ma requête, j’ai dû utiliser addNetworkInterceptor() . Le code est le suivant:

 OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); httpClient.addNetworkInterceptor(new AddHeaderInterceptor()); 

Et le code de l’intercepteur:

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

Ceci et plus d’exemples sur cet aperçu

Si vous utilisez la méthode addInterceptor pour append HttpLoggingInterceptor, il ne consignera pas les éléments ajoutés par d’autres intercepteurs appliqués plus tard que HttpLoggingInterceptor.

Par exemple: Si vous avez deux intercepteurs “HttpLoggingInterceptor” et “AuthInterceptor”, et que HttpLoggingInterceptor est appliqué en premier, vous ne pouvez pas afficher les http-params ou les en-têtes définis par AuthInterceptor.

 OkHttpClient.Builder builder = new OkHttpClient.Builder() .addNetworkInterceptor(logging) .addInterceptor(new AuthInterceptor()); 

Je l’ai résolu en utilisant la méthode addNetworkInterceptor.

J’ai trouvé un autre moyen pour Retrofit 1.9 et 2.0, pour le type de contenu Json.

 @Headers({"Accept: application/json"}) @POST("user/classes") Call addToPlaylist(@Body PlaylistParm parm); 

Vous pouvez append beaucoup plus d’en-têtes

 @Headers({ "Accept: application/json", "User-Agent: Your-App-Name", "Cache-Control: max-age=640000" })