Intereting Posts

Добавление заголовка во весь запрос с помощью Retrofit 2

В документации дооснащения 2 говорится:

Заголовки, которые необходимо добавить к каждому запросу, могут быть указаны с использованием перехватчика OkHttp.

Это можно сделать легко, используя предыдущую версию, вот связанный с ней QA.

Но, используя retrofit 2, я не мог найти что-то вроде setRequestInterceptor или setInterceptor который можно применить к объекту Retrofit.Builder .

Также кажется, что в OkHttp больше нет RequestInterceptor . Док-станция «Дооснащение» относится к перехватчику, что я не совсем понял, как использовать его для этой цели.

Как я могу это сделать?

     OkHttpClient httpClient = new OkHttpClient(); 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(); 

    Последняя версия для модернизации ЗДЕСЬ -> 2.1.0.

    Лямбда-версия:

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

    Уродливая длинная версия:

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

    полная версия:

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

    (Вам нужно добавить перехватчик регистрации, если вы планируете его использовать):

      //----- 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' 

    Для регистрации вашего запроса и ответа вам нужен перехватчик, а также для настройки заголовка вам нужен перехватчик. Вот решение для одновременного добавления перехватчика с помощью модификации 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 retrofit = new Retrofit.Builder() .baseUrl(url) .client(getHeader(authorizationValue)) .addConverterFactory(GsonConverterFactory.create()) .build(); 

    В моем случае addInterceptor() не работал, чтобы добавить заголовки HTTP к моему запросу, мне пришлось использовать addNetworkInterceptor() . Код выглядит следующим образом:

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

    И код перехватчика:

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

    Этот и другие примеры этого

    Если вы используете метод addInterceptor для добавления HttpLoggingInterceptor, он не будет регистрировать вещи, которые были добавлены другими перехватчиками, примененными позже HttpLoggingInterceptor.

    Например: если у вас есть два перехватчика «HttpLoggingInterceptor» и «AuthInterceptor», а также приложение HttpLoggingInterceptor, то вы не можете просмотреть http-params или заголовки, которые установлены AuthInterceptor.

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

    Я решил это, используя метод addNetworkInterceptor.