2016-03-04 55 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());

,隨時在應用運行時期間更改標頭的值
相關問題