2016-11-16 9 views
1

Dagger 2をRetrofit 2と組み合わせて使用​​したいと思っていましたが、GETリクエストを除いてすべてうまくいくようです。彼らは彼らに付随するヘッダーを持っていないようです。以下 Dagger 2でグローバルに設定されたヘッダーを送信するRetrofit 2を取得できません。

は私の全体のアプリのすべてのネットワーク関連の依存関係を提供 NetworkModuleを(存在振りかけ @ForApplicationスコープアノテーションを留意されたい)である。

@Module 
public class NetworkModule { 

    // … 

    @ForApplication 
    @Provides 
    OkHttpClient provideOkHttp(
      HttpLoggingInterceptor loggingInterceptor, 
      @Named(PREFERENCE_CUR_LOGIN_SESSION) Preference<LoginSession> loginSessionPreference, 
      DeviceCredentials deviceCredentials 
    ) { 
     final OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); 
     builder.addNetworkInterceptor(chain -> { 
      if (loginSessionPreference.isSet()) { 
       return chain.proceed(
         chain.request().newBuilder() 
           .addHeader("token", loginSessionPreference.get().getTokenId()) 
           .addHeader("device-id", deviceCredentials.getDeviceId()) 
           .addHeader("Content-Type", "application/json") 
           .build() 
       ); 
      } else { 
       return chain.proceed(
         chain.request().newBuilder().build() 
       ); 
      } 
     }); 
     return builder.build(); 
    } 

    @ForApplication 
    @Provides 
    Retrofit provideRetrofit(Gson gson, OkHttpClient client) { 
     return new Retrofit.Builder() 
       .baseUrl("http://xxx.xxx.xxx/api/1.0/") 
       .client(client) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .build(); 
    } 

    @ForApplication 
    @Provides 
    XxxApi provideApi(Retrofit retrofit) { 
     return retrofit.create(XxxApi.class); 
    } 
} 

このモジュールは私のApplicationComponent(他のモジュール間の依存関係として供給されます。 ):

@ForApplication 
@Component(
     modules = { 
       ApplicationModule.class, 
       RuntimeModule.class, 
       DateFormatModule.class, 
       PreferenceModule.class, 
       NetworkModule.class 
     } 
) 
public interface ApplicationComponent { 

    // … 
} 

は私がデバッグセッションを実行し、loginSessionPreference.isSet()trueとして評価されていることを確認したが、それでも私の要求はまだのWi現れてきましたどんなヘッダーでも:

11-16 16:55:22.748 21747-22569/xxx.xxx.xxx D/OkHttp: --> GET http://xxx.xxx.xxx/api/1.0/public/get-all-data/site http/1.1 
11-16 16:55:22.748 21747-22569/xxx.xxx.xxx D/OkHttp: --> END GET 

私は何かを見逃しましたか?すべての

+0

こちらからご覧くださいhttps://github.com/saveendhiman/SampleApp/blob/master/app/src/main/java/com/sampleapp/api/NetModule.java – Saveen

+0

@Raghunandan、isn ' 'addNetworkInterceptor'はすでに何をしていますか?まあ、正確にはメソッドではなく、渡された 'Interceptor'です。 –

+0

私はそれを今見ました。ごめんなさい! – Raghunandan

答えて

0

代わり.addNetworkInterceptorの使用.addInterceptor()

+0

それは、何も起こっていないと試してみました.. –

0

まずアレックスShutovが提案のようにaddInterceptor()を使用しています。

第2に、デバッグモードで、のaddHeader()メソッドが呼び出されていることを確認します。 同じRetrofitインスタンス(同じインジェクション)を使用すると、loginSessionPreference.isSet()は常にfalseを返すため、使用できませんでした。 OkHttpClient補強インスタンスを提供する必要があるが

あなたの方法provideOkHttp()が呼び出されます。方法provideOkHttp()が必要です。があり、オブジェクトOkHttpClientが作成されている間に注入されます。あなたはそれを最終的な変数として扱うことができます(コンパイラは最終的に私が思うようにします)。

loginSessionPreferenceを削除して、いくつかのヘッダーをハードコードしてください。問題があるかどうかを教えてくれます。

私の意見では、このアーキテクチャを少し変更する必要があります。

関連する問題