我改造2(2.0.2
當前)客戶需要定製標題添加到請求。改造2 - 在API級將報頭的優雅的方式
我使用的是Interceptor
這些頭文件添加到所有請求:
OkHttpClient httpClient = new OkHttpClient();
httpClient.networkInterceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
final Request request = chain.request().newBuilder()
.addHeader("CUSTOM_HEADER_NAME_1", "CUSTOM_HEADER_VALUE_1")
.addHeader("CUSTOM_HEADER_NAME_2", "CUSTOM_HEADER_VALUE_2")
...
.addHeader("CUSTOM_HEADER_NAME_N", "CUSTOM_HEADER_VALUE_N")
.build();
return chain.proceed(request);
}
});
Retrofit retrofitClient = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(httpClient)
.build();
一些標題我總是要添加,但一些頭我只需要根據特定端點的需求增加,對例如用戶是否需要被認證。
我想使用的註釋有控制,在API級別的能力,例如,像這樣:
public interface MyApi {
@NO_AUTH
@POST("register")
Call<RegisterResponse> register(@Body RegisterRequest data);
@GET("user/{userId}")
Call<GetUserResponse> getUser(@Path("userId") String userId);
}
發送請求時,以register
沒有必要添加的認證令牌,但缺少@NO_AUTH
註釋的請求將具有令牌標頭。
根據我的理解,Retrofit 2不支持自定義註釋,雖然我發現此替代方法適用於Custom Annotations with Retrofit 2,但它似乎有點太多。
我想避免需要通過每個請求這些標題,如:
public interface MyApi {
@POST("register")
Call<RegisterResponse> register(@Body RegisterRequest data);
@GET("user/{userId}")
Call<GetUserResponse> getUser(@Header("AuthToken") String token, @Path("userId") String userId);
}
就覺得這是多餘的我每次調用該方法,而不是在攔截器做的時間來做到這一點(因爲我可以靜態訪問標題值)。
我不知怎麼竟需要在我Interceptor.intercept
實施知道這個具體的要求是否應該有一個具體的物管。
任何想法如何使這項工作?
我喜歡一個通用的解決方案,而不是僅僅爲驗證令牌的情況下,但具體的解決方案是值得歡迎的爲好。 感謝
這是否意味着您對每個請求都使用新的'''OkHttpClient'''? –
@panduka不,這只是爲了舉例,你可以有一個客戶。 –
這實際上是最乾淨的解決方案,謝謝分享:) – MatPag