2017-08-21 2 views
0

J'essaie de définir un champ d'en-tête pour toutes mes demandes ("Content-Type: text/xml; charset = utf-8").Impossible de définir un champ d'en-tête global avec Retrofit 2.3.0

Pour l'instant, je spécifier dans mon interface Retrofit, au-dessus de chaque appel comme celui-ci:

@Headers("Content-Type: text/xml; charset=utf-8") 
@POST("./") 
Call<...> method(@Header("MyAction") String header, @Body ... envelop); 

Il fonctionne, mais depuis toute ma part de demande le même type de contenu Je voudrais spécifiez ceci seulement une fois. De Retrofit's doc il peut être réalisé en utilisant un intercepteur comme celui-ci:

OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
httpClient.addInterceptor(new Interceptor() { 
    @Override 
    public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request original = chain.request(); 

     Request request = original.newBuilder() 
      .header("User-Agent", "Your-App-Name") 
      .header("Accept", "application/vnd.yourapi.v1.full+json") 
      .method(original.method(), original.body()) 
      .build(); 

     return chain.proceed(request); 
    } 
} 

OkHttpClient client = httpClient.build(); 
Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(API_BASE_URL) 
    .addConverterFactory(GsonConverterFactory.create()) 
    .client(client) 
    .build(); 

Il ne fonctionne pas pour moi. Selon http3 Logging Interceptor, ma valeur d'en-tête est définie sur "Content-Type: application/xml; charset = utf-8", je ne sais pas pourquoi cette valeur en particulier.

J'ai rencontré beaucoup de sujets où ce problème a été rencontré mais je n'ai pas encore trouvé de réponse satisfaisante.

Comment puis-je spécifier ce champ d'en-tête une fois? Est-ce un bug dans Retrofit? Y a-t-il une solution de contournement?

Merci

Répondre

0

J'ai eu un problème similaire avec les en-têtes. Dans mon cas, j'avais deux intercepteurs:

  1. pour modifier les en-têtes;
  2. pour la journalisation (HttpLoggingInterceptor);

Je les Posé comme ceci:

OkHttpClient.Builder() 
      .addInterceptor(loggingInterceptor) 
      .addInterceptor { chain -> 
       /* edit headers */ 
       return chain.proceed(builder.build()) 
      } 
      .build() 

Il ne marchait pas. Pour résoudre i zappent méthode de réglage (sons étranges, mais il a aidé) comme ceci:

OkHttpClient.Builder() 
      .addInterceptor { chain -> 
       /* edit headers */ 
       return chain.proceed(builder.build()) 
      } 
      .addInterceptor(loggingInterceptor) 
      .build() 

Vous pouvez essayer cette astuce, nous espérons qu'il vous aidera.

+0

Je ne connais pas la syntaxe en utilisant les caractères '{' et '->'. Est-il équivalent à: 'builder.addInterceptor (nouvel Interceptor() {@Overide Interception de la réponse publique (chaîne @NonNull Chain) throws IOException {Demande de requête = chain.request(). NewBuilder() .addHeader (" Content-Type ", "text/xml; jeu de caractères = UTF-8") .build(); return chaîne.proceed (requête);}}); '? Si oui, j'ai toujours le même problème. – Louis