Мне нужно добавить параметр запроса для каждого запроса, сделанного библиотекой Retrofit 2.0.0-beta2. Я нашел это решение для Retrofit 1.9, но как добавить RequestInterceptor
в новейшую версию библиотеки?
Мой интерфейс:
@GET("user/{id}") Call<User> getUser(@Path("id")long id); @GET("users/") Call<List<User>> getUser();
Клиент:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(CLIENT) // custom OkHTTP Client .build(); service = retrofit.create(userService.class);
Для полноты, вот полный код, который вам нужно добавить для каждого запроса Retrofit 2.x с помощью OkHttp-Interceptor:
OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); HttpUrl url = request.url().newBuilder().addQueryParameter("name","value").build(); request = request.newBuilder().url(url).build(); return chain.proceed(request); } }); Retrofit retrofit = new Retrofit.Builder() .baseUrl("...") .client(client) .build();
Теперь у Retrofit есть версия 2.0.0, и это мое решение:
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { String uid = "0"; long timestamp = (int) (Calendar.getInstance().getTimeInMillis() / 1000); String signature = MD5Util.crypt(timestamp + "" + uid + MD5_SIGN); String base64encode = signature + ":" + timestamp + ":" + uid; base64encode = Base64.encodeToString(base64encode.getBytes(), Base64.NO_WRAP | Base64.URL_SAFE); Request request = chain.request(); HttpUrl url = request.url() .newBuilder() .addQueryParameter("pageSize", "2") .addQueryParameter("method", "getAliasList") .build(); request = request .newBuilder() .addHeader("Authorization", "zui " + base64encode) .addHeader("from_client", "ZuiDeer") .url(url) .build(); Response response = chain.proceed(request); return response; } }).build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(ApiConstants.API_BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); mRestfulService = retrofit.create(RestfulService.class);
Вы должны переключиться на Interceptor
из OkHttp
. Создайте OkHttpClient
, добавьте Interceptor
к этому проходу этого клиента в Retrofit Builder
.
OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { ... } }); Retrofit retrofit = new Retrofit.Builder() .baseUrl("...") .client(client) .build();
Затем вы можете настроить запрос к вашим потребностям, используя chain.request().newBuilder()
. Подробнее см. В документации .
В 3.2.0
и выше вместо этого вы должны использовать addInterceptor()
в OkHttpClient.Builder
.
Например, с Retrolambda
:
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor() .setLevel(HttpLoggingInterceptor.Level.BASIC); Interceptor clientInterceptor = chain -> { Request request = chain.request(); HttpUrl url = request.url().newBuilder().addQueryParameter("name", "value").build(); request = request.newBuilder().url(url).build(); return chain.proceed(request); }; OkHttpClient client = new OkHttpClient.Builder() .addNetworkInterceptor(clientInterceptor) .addInterceptor(loggingInterceptor) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(client) .build();