Перехватчик единого запроса Retrofit2 и OkHttp3

Начиная с OkHttp v3 OkHttpClient неизменен, как и список перехватчиков.

Начиная с Retrofit 2.0-beta3 это зависит от OkHttp v3.

В моем приложении мне нужно проанализировать ключ реферера Google Analytics Campain, который имеет формат «a = 1 & b = 2 & c = 3», и добавить его к URL-адресу запроса регистрации.

С предыдущей версией дооснащения это было легко сделать, добавив

retrofit.client().interceptors().add(0, chain -> {
    final Request httpRequest = chain.request();
    return chain.proceed(httpRequest.newBuilder().url(httpRequest.httpUrl().toString() + "&" + request.getUtmParams()).build());
});

перед выполнением звонка и

retrofit.client().interceptors().remove(0);

после звонка продолжить.

Не могу понять, как добиться того же поведения с новой версией. Пожалуйста помоги.

UPD 1. Цель состоит в том, чтобы управлять URL-адресом отдельного запроса. Добавление строки в конец - это всего лишь пример. Использование @QueryMap - это вариант, но он требует синтаксического анализа строки параметров, чего я стараюсь избегать.


person Volkman    schedule 18.02.2016    source источник
comment
OkHttp Interceptors особо не изменился. Парсить utm из url легко с помощью uri utils.   -  person Nikola Despotoski    schedule 19.02.2016


Ответы (3)


Используйте карту запросов.

public interface ApiService {
@GET("YOUR_BASE_URL")
Call<Login> authenticate(@Query("a") String a, @Query("b") String b,@Query("c") String c);
}
person Shakeeb Ayaz    schedule 18.02.2016

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

person Jesse Wilson    schedule 19.02.2016

В зависимости от вашего метода запроса, но здесь я использую GET

// Вы также можете использовать Map Query, чтобы получить тот же результат

public interface ApiService {

    @GET("api/{a}/{b}/{c}")
    Call<Login> authenticate(@Path("a") String a, @Path("b") String password, @Path("c") String c);
}

Создайте объект EntityObject

public EntityObject {

   Public String a;

   Public String b;

   Public String c;
}

Используйте модернизацию, чтобы сделать свой запрос с вашими параметрами

private void makeRemoteRequest(String a, String b, String c){

  Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

 ApiInterface mService = retrofit.create(ApiService.class);

Call<Login> mService = mService.authenticate(a, b, c);
    mService.enqueue(new Callback<Login>() {
        @Override
        public void onResponse(Call<Login> call, Response<Login> response) {


        }

        @Override
        public void onFailure(Call<Login> call, Throwable t) {

        }
    });
}
person Inducesmile    schedule 18.02.2016
comment
Да, это можно сделать с помощью QueryMap, но для этого требуется анализ строки utm_params (разделенной на &, а затем на =), и я хочу избежать этого. - person Volkman; 18.02.2016
comment
Цель состоит в том, чтобы контролировать URL-адрес отдельного запроса. Добавление строки в конец - это всего лишь пример. - person Volkman; 18.02.2016