使用Retrofit 2为所有请求添加标头

Ash*_*lak 112 java android header httprequest retrofit

Retrofit 2的文档说:

可以使用OkHttp拦截器指定需要添加到每个请求的标头.

可以使用以前的版本轻松完成,这是相关的QA.

但是使用改造2,我找不到可以应用于对象的类似物setRequestInterceptorsetInterceptor方法Retrofit.Builder.

此外,它似乎没有RequestInterceptorOkHttp了.Retrofit的doc将我们引用到Interceptor,我不太明白如何将它用于此目的.

我怎样才能做到这一点?

dtx*_*x12 177

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

httpClient.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request().newBuilder().addHeader("parameter", "value").build();
        return chain.proceed(request);
    }
});
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(url).client(httpClient.build()).build();
Run Code Online (Sandbox Code Playgroud)

  • 在retrofit2-beta3版本中,它有点不同.请参见:http://stackoverflow.com/questions/34973432/okhttpclient-throws-exception-after-upgrading-to-okhttp3 (5认同)
  • 我们如何确认这些标头已发送。当我在 Call `enqueue` 上调试时,我看不到默认标头。 (2认同)

OWA*_*DVL 73

最新的改装版本HERE - > 2.1.0.

lambda版本:

  builder.addInterceptor(chain -> {
    Request request = chain.request().newBuilder().addHeader("key", "value").build();
    return chain.proceed(request);
  });
Run Code Online (Sandbox Code Playgroud)

丑陋的长版:

  builder.addInterceptor(new Interceptor() {
    @Override public Response intercept(Chain chain) throws IOException {
      Request request = chain.request().newBuilder().addHeader("key", "value").build();
      return chain.proceed(request);
    }
  });
Run Code Online (Sandbox Code Playgroud)

完整版本:

class Factory {

public static APIService create(Context context) {

  OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
  builder.readTimeout(10, TimeUnit.SECONDS);
  builder.connectTimeout(5, TimeUnit.SECONDS);

  if (BuildConfig.DEBUG) {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
    builder.addInterceptor(interceptor);
  }

  builder.addInterceptor(chain -> {
    Request request = chain.request().newBuilder().addHeader("key", "value").build();
    return chain.proceed(request);
  });

  builder.addInterceptor(new UnauthorisedInterceptor(context));
  OkHttpClient client = builder.build();

  Retrofit retrofit =
      new Retrofit.Builder().baseUrl(APIService.ENDPOINT).client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();

  return retrofit.create(APIService.class);
  }
}
Run Code Online (Sandbox Code Playgroud)

gradle文件(如果你打算使用它,你需要添加日志拦截器):

  //----- Retrofit
  compile 'com.squareup.retrofit2:retrofit:2.1.0'
  compile "com.squareup.retrofit2:converter-gson:2.1.0"
  compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"
  compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'
Run Code Online (Sandbox Code Playgroud)


swe*_*man 11

对于记录您的请求和响应,您需要一个拦截器,并且还需要设置拦截器,您需要一个拦截器,这是使用改造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;

    }
Run Code Online (Sandbox Code Playgroud)

现在,在您的改造对象中,在客户端中添加此标头

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(getHeader(authorizationValue))
                .addConverterFactory(GsonConverterFactory.create())
                .build();
Run Code Online (Sandbox Code Playgroud)


Avi*_*rma 8

我找到了Retrofit 1.9和2.0的另一种方式,用于Json内容类型.

@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
Run Code Online (Sandbox Code Playgroud)

你可以添加更多的标题,即

@Headers({
        "Accept: application/json",
        "User-Agent: Your-App-Name",
        "Cache-Control: max-age=640000"
    })
Run Code Online (Sandbox Code Playgroud)

  • 如何为接口中的所有请求制作一个标头而不进行复制? (2认同)

vog*_*Dev 5

在我的情况下addInterceptor()无法为我的请求添加HTTP标头,我不得不使用addNetworkInterceptor().代码如下:

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addNetworkInterceptor(new AddHeaderInterceptor());
Run Code Online (Sandbox Code Playgroud)

和拦截器代码:

public class AddHeaderInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {

        Request.Builder builder = chain.request().newBuilder();
        builder.addHeader("Authorization", "MyauthHeaderContent");

        return chain.proceed(builder.build());
    }
}
Run Code Online (Sandbox Code Playgroud)

关于这个要点的这个和更多的例子


Gal*_*mov 5

如果您使用 addInterceptor 方法添加 HttpLoggingInterceptor,它将不会记录由晚于 HttpLoggingInterceptor 应用的其他拦截器添加的内容。

例如:如果您有两个拦截器“HttpLoggingInterceptor”和“AuthInterceptor”,并且首先应用了HttpLoggingInterceptor,那么您将无法查看AuthInterceptor 设置的http-params 或headers。

OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addNetworkInterceptor(logging)
.addInterceptor(new AuthInterceptor());
Run Code Online (Sandbox Code Playgroud)

我通过使用 addNetworkInterceptor 方法解决了它。

  • 您还可以添加“HttpLoggingInterceptor”作为最后一个拦截器来查看最终请求。 (2认同)