2016-03-04 7 views
5

Retrofit2を使用するように移行しようとしていますが、分析用に動的に生成されたヘッダーを渡す必要がある要求。Retrofit 2(Android)でヘッダーのリストを動的に設定する方法

@Headersはパラメータレベルではサポートされていません。ヘッダーフィールド名は現在のアクティビティによって異なるため、@Headerは使用できません。

execute()の直前にヘッダーを追加する方法はありますか? (@ QueryMap/@ FieldMapと似たものを探していますが、ヘッダーを探しています)

注:クライアントを初期化する際にヘッダーのリストがないので、これを行うためにインターセプターを使用することはできません。

答えて

2

インターセプターを使用することはできますが、使用する必要があります。
あなたが必要とするのは少しアーキテクチャです。

まず、必要なヘッダーを提供するヘルパーを作成します。

public class AnalyticsHeader { 
private String analyticsHeaderName; 
private String analyticsHeaderValue; 

public void setHeaderValue(String header) { 
    this.analyticsHeaderValue = header; 
} 

public void setHeaderName(String header) { 
    this.analyticsHeaderName = header; 
} 

public String getHeaderName() { 
    return analyticsHeaderName; 
} 
public String getHeaderValue() { 
    return analyticsHeaderValue; 
} 
} 

だけ渡すインターセプターの作成時に、今すぐ(依存性の注入を使用し、さらに良いか)私たちのアプリケーションMainActivity例えば、あなたのアプリケーション内部にアクセス可能な場所に

をこのクラスのインスタンスをキープインターセプターへのAnalyticsHeaderのインスタンス:

public static final class AnalyticsInterceptor implements Interceptor { 
     private final AnalyticsHeader header; 

     public AnalyticsInterceptor(AnalyticsHeader header) { 
      this.header = header; 
     } 

     @Override 
     public Response intercept(Chain chain) throws IOException { 
      final Request original = chain.request(); 
      Response response; 
      if (header.getHeader() != null) { 
       Request request = original.newBuilder() 
         .header(header.getHeaderName(), header.getHeaderValue()) 
         .method(original.method(), original.body()) 
         .build(); 
       response = chain.proceed(request); 
      } else { 
       response = chain.proceed(original); 
      } 

     return response; 
     } 
} 

そして...

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.addInterceptor(new AnalyticsInterceptor(CentralPlaceInApp.getAnalyticsHeader()); 
... 
retrofit = new Retrofit.Builder() 
       .baseUrl(config.getRestUrl()) 
       .client(builder.build()) 
       .build(); 

今すぐ、あなたのアプリケーションランタイム中にいつでもヘッダの値を変更することができますCentralPlaceInApp.getAnalyticsHeader().setHeaderValue(CurrentActivity.class.getSimpleName());

関連する問題