我們正在嘗試遷移到使用Retrofit2,並且遇到了需要爲每個應用程序傳遞一組動態生成的標題(用於分析)的需求問題請求。如何在Retrofit 2(Android)中動態設置標題列表
@Headers在參數級別不受支持,並且由於標題字段名稱因當前活動而異,因此我無法使用@Header。
有沒有辦法在execute()之前追加頭部? (尋找類似於@ QueryMap/@FieldMap但類似於標題的東西)
注意:在初始化客戶端時(因此不能使用攔截器來執行此操作),我沒有頭部列表。
我們正在嘗試遷移到使用Retrofit2,並且遇到了需要爲每個應用程序傳遞一組動態生成的標題(用於分析)的需求問題請求。如何在Retrofit 2(Android)中動態設置標題列表
@Headers在參數級別不受支持,並且由於標題字段名稱因當前活動而異,因此我無法使用@Header。
有沒有辦法在execute()之前追加頭部? (尋找類似於@ QueryMap/@FieldMap但類似於標題的東西)
注意:在初始化客戶端時(因此不能使用攔截器來執行此操作),我沒有頭部列表。
你仍然可以(也必須)使用攔截器。
所有你需要的是一個小建築。
首先創建一個幫助程序,提供必要的標題。
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());