我正在寻找一种解决方案,以定义在所有请求中使用的唯一标头。今天我使用@Header
每个请求传递像参数一样但我想只定义适用于所有请求的头,而不需要像参数一样传递,例如在我的请求@GET
和{{上修复此标头1}}
今天我用这个。请注意,我需要将每个请求@POST
定义为参数。
@GET
答案 0 :(得分:33)
官方文件:
可以使用RequestInterceptor指定需要添加到每个请求的标头。以下代码创建一个RequestInterceptor,它将为每个请求添加User-Agent标头。
RequestInterceptor requestInterceptor = new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("User-Agent", "Retrofit-Sample-App");
}
};
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.setRequestInterceptor(requestInterceptor)
.build();
答案 1 :(得分:16)
答案 2 :(得分:2)
取决于你的OkHttp lib:
OkHttpClient httpClient = new OkHttpClient();
httpClient.networkInterceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request().newBuilder().addHeader("User-Agent", System.getProperty("http.agent")).build();
return chain.proceed(request);
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient)
.build();
答案 3 :(得分:1)
正如其他答案所述,您需要RequestInterceptor
。幸运的是,这个接口只有一个方法,所以Java 8及以上版本将它视为一个功能接口,让你用lambda实现它。简单!
例如,如果您要包装特定API并且需要每个端点的标头,则可以在构建适配器时执行此操作:
RestAdapter whatever = new RestAdapter.Builder().setEndpoint(endpoint)
.setRequestInterceptor(r -> r.addHeader("X-Special-Vendor-Header", "2.0.0"))
.build()
答案 4 :(得分:0)
这是使用改造2.1添加标题的解决方案。我们需要添加拦截器
public OkHttpClient getHeader(final String authorizationValue ) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okClient = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.addNetworkInterceptor(
new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = null;
if (authorizationValue != null) {
Log.d("--Authorization-- ", authorizationValue);
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.addHeader("Authorization", authorizationValue);
request = requestBuilder.build();
}
return chain.proceed(request);
}
})
.build();
return okClient;
}
现在,在您的改装对象中,在客户端
中添加此标头Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(getHeader(authorizationValue))
.addConverterFactory(GsonConverterFactory.create())
.build();