如何使用拦截器在Retrofit 2.0中添加标题

我们的团队决定采用Retrofit 2.0 ,我正在做一些初步的研究。 我是这个图书馆的新手,希望得到社区的一些帮助:)

正如标题所述,我想知道如何使用interceptor通过我们的Android应用程序中的Retrofits 2.0添加自定义标头。 在Retrofit 1.X中有很多关于使用interceptor添加头文件的教程 ,但是由于最新版本中的API已经发生了很大的变化,我不确定如何在新版本中调整这些方法。 此外,Retrofit尚未更新其新文档。

例如,在下面的代码中,我应该如何实现Interceptor类来添加额外的头文件? 另外, 无证Chain对象究竟是什么? intercept()会在什么时候被调用?

  OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); // How to add extra headers? return response; } }); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_API_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); 

任何人都可以分享这个问题的一些想法?

谢谢!!

看一下这个。

 public class HeaderInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); request = request.newBuilder() .addHeader("appid", "hello") .addHeader("deviceplatform", "android") .removeHeader("User-Agent") .addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0") .build(); Response response = chain.proceed(request); return response; } } 

从接受的答案的另一种select

 public class HeaderInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); request = request.newBuilder() .addHeader("headerKey0", "HeaderVal0") .addHeader("headerKey0", "HeaderVal0--NotReplaced/NorUpdated") //new header added .build(); //alternative Headers moreHeaders = request.headers().newBuilder() .add("headerKey1", "HeaderVal1") .add("headerKey2", "HeaderVal2") .set("headerKey2", "HeaderVal2--UpdatedHere") // existing header UPDATED if available, else added. .add("headerKey3", "HeaderKey3") .add("headerLine4 : headerLine4Val") //line with `:`, spaces doesn't matter. .removeAll("headerKey3") //Oops, remove this. .build(); request = request.newBuilder().headers(moreHeaders).build(); /* ##### List of headers ##### */ // headerKey0: HeaderVal0 // headerKey0: HeaderVal0--NotReplaced/NorUpdated // headerKey1: HeaderVal1 // headerKey2: HeaderVal2--UpdatedHere // headerLine4: headerLine4Val Response response = chain.proceed(request); return response; } } 
  public class ServiceFactory { public static ApiClient createService(String authToken, String userName, String password) { OkHttpClient defaultHttpClient = new OkHttpClient.Builder() .addInterceptor( chain -> { Request request = chain.request().newBuilder() .headers(getJsonHeader(authToken)) .build(); return chain.proceed(request); }) .authenticator(getBasicAuthenticator(userName, password)) .build(); return getService(defaultHttpClient); } private static Headers getJsonHeader(String authToken) { Headers.Builder builder = new Headers.Builder(); builder.add("Content-Type", "application/json"); builder.add("Accept", "application/json"); if (authToken != null && !authToken.isEmpty()) { builder.add("X-MY-Auth", authToken); } return builder.build(); } private static Authenticator getBasicAuthenticator(final String userName, final String password) { return (route, response) -> { String credential = Credentials.basic(userName, password); return response.request().newBuilder().header("Authorization", credential).build(); }; } private static ApiClient getService(OkHttpClient defaultHttpClient) { return new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(defaultHttpClient) .build() .create(ApiClient.class); } } 

检查Android入门基本authentication,他们利用拦截器,这是非常清楚的。

https://futurestud.io/blog/android-basic-authentication-with-retrofit

你可以使用拦截器的头像这样的内置方法

  interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); Request.Builder builder = original.newBuilder(); builder.header("Authorization","Bearer "+ LeafPreference.getInstance(context).getString(LeafPreference.TOKEN)); Request request = builder.method(original.method(), original.body()) .build(); Log.e("request",request.urlString()); Log.e("header",request.header("Authorization")); return chain.proceed(request); } }); }