Есть ли способ добавить параметр запроса к каждому запросу с помощью Retrofit 2?

Мне нужно добавить параметр запроса для каждого запроса, сделанного библиотекой 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); 

Solutions Collecting From Web of "Есть ли способ добавить параметр запроса к каждому запросу с помощью Retrofit 2?"

Для полноты, вот полный код, который вам нужно добавить для каждого запроса 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();