如何使用Retrofit为所有请求定义标头?

时间:2014-11-30 12:35:18

标签: java android rest http-headers retrofit

我正在寻找一种解决方案,以定义在所有请求中使用的唯一标头。今天我使用@Header每个请求传递像参数一样但我想只定义适用于所有请求的头,而不需要像参数一样传递,例如在我的请求@GET和{{上修复此标头1}}

今天我用这个。请注意,我需要将每个请求@POST定义为参数。

@GET

5 个答案:

答案 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)

Value中,您需要拦截Retrofit 2

提供的网络层上的请求
OkHttp

检查this,它很好地解释了差异。

答案 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();