我的改装2(2.0.2
当前)客户端需要向请求添加自定义标头。
我正在使用一个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 不支持自定义注释,虽然我发现了这个解决方法使用 Retrofit 2 自定义注释 https://medium.com/@andretietz/custom-annotations-with-retrofit-2-8701ca7ce102#.79dg4wb8v,好像有点太多了。
我想避免需要每个请求传递这些标头,例如:
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
实现此特定请求是否应具有特定标头。
知道我怎样才能做到这一点吗?
我更喜欢通用的解决方案,不仅适用于身份验证令牌的情况,而且也欢迎特定的解决方案。
谢谢