Добавление заголовка ко всем запросам с помощью Retrofit 2
документация по модернизации 2 говорит:
заголовки, которые должны быть добавлены к каждому запросу, могут быть указаны с помощью перехватчика OkHttp.
Это можно сделать легко, используя предыдущую версию, вот соответствующий QA.
но с помощью retrofit 2, я не мог найти что-то вроде setRequestInterceptor или setInterceptor метод, который может быть применен к
6 ответов:
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();
последняя модифицированная версия здесь -> 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); } }gradle file (вам нужно добавить перехватчик журнала, Если вы планируете его использовать):
//----- 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'
для регистрации вашего запроса и ответа вам нужен перехватчик, а также для установки заголовка вам нужен перехватчик, вот решение для добавления обоих перехватчиков сразу с помощью retrofit 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-запроса или заголовков, которые установлены AuthInterceptor.
OkHttpClient.Builder builder = new OkHttpClient.Builder() .addNetworkInterceptor(logging) .addInterceptor(new AuthInterceptor());Я решил ее, используя метод addNetworkInterceptor.
Я нашел другой способ для модернизации 1.9 и 2.0, для типа контента Json.
@Headers({"Accept: application/json"}) @POST("user/classes") Call<playlist> addToPlaylist(@Body PlaylistParm parm);Вы можете добавить еще много заголовков, т. е.
@Headers({ "Accept: application/json", "User-Agent: Your-App-Name", "Cache-Control: max-age=640000" })
Comments