我的Retrofit 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中使用自定义注释的解决方法,但这似乎有点过于繁琐。
我想避免每次请求都需要传递这些标头,例如:
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
方法中知道是否应为此特定请求添加特定的标题。
你有什么想法可以使其工作?
我希望有一个通用解决方案,而不仅仅是针对认证令牌情况的解决方案,但是如果有特定的解决方案也可以。谢谢。
HttpLoggingInterceptor
在头部仍然显示@: NoAuth
。这是因为它在被移除之前被拦截了吗? - PooryaHttpLoggingInterceptor
?如果是这种情况,那么日志记录会在这个拦截器删除头部之前发生。 - Nitzan TomerHttpLoggingInterceptor
吗?还是会有问题? - Nitzan Tomer