2017-09-22 8 views
1

Je Singleton module de poignard pour OkHttp client et je suis en train d'ajouter tête à l'aide InterceptorAndroid 2.0 Rénovation avec l'ajout d'en-têtes intercepteurs ne fonctionne pas

@Provides 
@Singleton 
OkHttpClient provideOkhttpClient(Cache cache, final LocalData localData) { 
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
    logging.setLevel(HttpLoggingInterceptor.Level.HEADERS); 

    OkHttpClient.Builder client = new OkHttpClient.Builder(); 
    client.readTimeout(60, TimeUnit.SECONDS); 
    client.addInterceptor(logging); 
    client.addNetworkInterceptor(new Interceptor() { 
     @Override 
     public Response intercept(@NonNull Chain chain) throws IOException { 
      Request original = chain.request(); 
      Request.Builder requestBuilder = original.newBuilder() 
        .addHeader("Hp-Application", "Android"); 
      Request request = requestBuilder.build(); 
      Response originalResponse = chain.proceed(request); 
      try { 
       if (originalResponse.code() == 200) { 
        localData.setLastUpdateTime(System.currentTimeMillis()); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return originalResponse; 
     } 
    }); 
    client.connectTimeout(60, TimeUnit.SECONDS); 
    client.cache(cache); 
    return client.build(); 
} 

Mais en regardant les journaux, je ne vois pas en-tête prévu . De plus, je reçois une erreur, car un appel spécifique ne fonctionne pas sans l'en-tête requis.

J'ai essayé aussi d'ajouter avec addInterceptor()/addNetworkInterceptor() en utilisant différentes classes

public class HeaderInterceptor 
     implements Interceptor { 
    @Override 
    public Response intercept(Chain chain) 
      throws IOException { 
     Request request = chain.request(); 
     request = request.newBuilder() 
       .addHeader("Hp-Application", "Android") 
       .build(); 
     return chain.proceed(request); 
    } 
} 

Mais cette façon n'a pas fonctionné pour moi aussi.

Comment puis-je ajouter cet en-tête à chaque appel d'application ayant une seule implémentation?

Répondre

1

L'ordre dans lequel vous ajoutez les questions intercepteurs. Votre intercepteur de journalisation s'exécute en premier, et seulement après cela est l'exécution de l'intercepteur d'ajout d'en-tête.

Pour une meilleure expérience de journalisation, définissez l'intercepteur de journalisation en dernier.

+0

existe-t-il une documentation ou des notes de mise à jour dans laquelle ceci est mentionné, cela serait utile s'il vous plaît mettre à jour si possible –

0

Vous n'avez pas besoin d'utiliser d'intercepteur pour envoyer des en-têtes dans Retrofit. Utilisez simplement l'annotation @Headers dans la méthode ou l'annotation @Header dans le champ.

@Headers("Accept: application/json") 
@GET("my/data") 
Call<YourClass> getData(@Header("Hp-Application") String value); 
+0

J'ai environ 100 appels. Vous me conseillez d'ajouter '@ Header' à chacun? :) –

+0

Non, je ne vais pas supprimer la réponse car elle pourrait être utile pour les futurs googleurs. –

0

Hey @Igor essayer cet extrait cela pourrait aider

public class RetrofitClient { 

    private static String BASE_URL = "http://192.168.0.100/rest/main.php/"; 
    private static Retrofit retrofit = null; 

    public static Retrofit getRetroftInstance() { 
     if (retrofit == null) { 

      OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
      httpClient.addNetworkInterceptor(new SessionRequestInterceptor()); 
      httpClient.addNetworkInterceptor(new ReceivedCookiesInterceptor()); 

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

     return retrofit; 
    }} 

public class ReceivedCookiesInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Response originalResponse = chain.proceed(chain.request()); 

     if (!originalResponse.headers("Set-Cookie").isEmpty()) { 
      HashSet<String> cookies = new HashSet<>(); 
      for (String header : originalResponse.headers("Set-Cookie")) { 
       cookies.add(header); 
       if(header.startsWith("XSRF-TOKEN")) { 
        String newCookie[]=header.split(";"); 
        System.out.println("newCookie Length: "+newCookie.length); 
        for(String ss:newCookie) { 
         if(ss.startsWith("XSRF-TOKEN")) { 
          System.out.println("Cookies ss: " + ss); 
          sharedPrefs.setToken(ss); 
         } 
        } 
       } 
      } 
     } 
     return originalResponse; 
    } 
} 

public class SessionRequestInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request original = chain.request(); 

     Request.Builder request = original.newBuilder(); 

     request.header("Cookie",ServiceSharedPrefs.getInstance().getToken())); 

     request.method(original.method(), original.body()); 

     return chain.proceed(request.build()); 
    } 

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



          // Request customization: add request headers 
          Request.Builder requestBuilder = original.newBuilder(). 
            header(AUTHENTICATION_HEADER, AUTHENTICATION_KEY). 
            method(original.method(), original.body()); 


          Request request = requestBuilder.build(); 

          //System.out.println(request.toString()); 

          return chain.proceed(request); 
         } 
        }).addInterceptor(logging) 
      .build();