Подтвердить что ты не робот

Есть ли способ добавить параметр запроса к каждому запросу с помощью 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);
4b9b3361

Ответ 1

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

Ответ 2

теперь у 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);

Ответ 3

Вам нужно переключиться на 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(). Подробнее см. .

Ответ 4

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