Adding header to all request with Retrofit 2

前端 未结 10 1350
北荒
北荒 2020-11-29 17:46

Retrofit 2\'s documentation says:

Headers that need to be added to every request can be specified using an OkHttp interceptor.

I

相关标签:
10条回答
  • 2020-11-29 18:00

    Try this type header for Retrofit 1.9 and 2.0. For Json Content Type.

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

    You can add many more headers i.e

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

    Dynamically Add to headers:

    @POST("user/classes")
    Call<ResponseModel> addToPlaylist(@Header("Content-Type") String content_type, @Body RequestModel req);
    

    Call you method i.e

    mAPI.addToPlayList("application/json", playListParam);
    

    Or

    Want to pass everytime then Create HttpClient object with http Interceptor:

    OkHttpClient httpClient = new OkHttpClient();
            httpClient.networkInterceptors().add(new Interceptor() {
                @Override
                public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
                    Request.Builder requestBuilder = chain.request().newBuilder();
                    requestBuilder.header("Content-Type", "application/json");
                    return chain.proceed(requestBuilder.build());
                }
            });
    

    Then add to retrofit object

    Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();
    

    UPDATE if you are using Kotlin remove the { } else it will not work

    0 讨论(0)
  • 2020-11-29 18:01

    The Latest Retrofit Version HERE -> 2.1.0.

    lambda version:

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

    ugly long version:

      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);
        }
      });
    

    full version:

    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);
      }
    }
    

    gradle file (you need to add the logging interceptor if you plan to use it):

      //----- 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'
    
    0 讨论(0)
  • 2020-11-29 18:06

    In my case addInterceptor()didn't work to add HTTP headers to my request, I had to use addNetworkInterceptor(). Code is as follows:

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

    And the interceptor code:

    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());
        }
    }
    

    This and more examples on this gist

    0 讨论(0)
  • 2020-11-29 18:13

    In kotlin adding interceptor looks that way:

    .addInterceptor{ it.proceed(it.request().newBuilder().addHeader("Cache-Control", "no-store").build())}
    
    0 讨论(0)
  • 2020-11-29 18:17
    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();
    
    0 讨论(0)
  • 2020-11-29 18:17

    If you use addInterceptor method for add HttpLoggingInterceptor, it won't be logging the things that added by other interceptors applied later than HttpLoggingInterceptor.

    For example: If you have two interceptors "HttpLoggingInterceptor" and "AuthInterceptor", and HttpLoggingInterceptor applied first, then you can't view the http-params or headers which set by AuthInterceptor.

    OkHttpClient.Builder builder = new OkHttpClient.Builder()
    .addNetworkInterceptor(logging)
    .addInterceptor(new AuthInterceptor());
    

    I solved it, via using addNetworkInterceptor method.

    0 讨论(0)
提交回复
热议问题