HttpLoggingInterceptor (OkHttp3) регистрирует много раз для каждого запроса

#android #logging #interceptor #retrofit2 #okhttp3

#Android #ведение журнала #перехватчик #retrofit2 #okhttp

Вопрос:

Я пытаюсь выполнить некоторые запросы, используя Retrofit2 и OkHttp3, и перехватывать их с помощью HttpLoggingInterceptor. Я внедряю клиент OkHttp с помощью Dagger.. и все в порядке, но когда я просто делаю запрос на свой сервер, я вижу запрос и ответ, зарегистрированные в Logcat три или более раз, когда это должно быть только один раз..

Часть кода, в которой я устанавливаю перехватчик, выглядит так:

 HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY); 
httpClient.addInterceptor(logging);
  

Пример результата Logcat, только для одного запроса, вызванного:

 D/OkHttp: --> GET http://date.jsontest.com/ http/1.1
D/OkHttp: Accept: application/json
D/OkHttp: --> END GET
D/OkHttp: --> GET http://date.jsontest.com/ http/1.1
D/OkHttp: Accept: application/json
D/OkHttp: --> END GET
D/OkHttp: --> GET http://date.jsontest.com/ http/1.1
  

В чем может быть проблема? Любая помощь?
Спасибо

Ответ №1:

Нашел ответ здесь (ответ шахсурайка, который прокомментировал 24 сентября 2017 года): https://github.com/square/retrofit/issues/12427

У меня был HTTPLogger и chain.proceed(..) в самом перехватчике. Поэтому, предполагая, что HTTPLogger внутренне также вызывает chain.proceed(), который, таким образом, выполняет два запроса, я добавил networkinterceptor и переместил HTTPLogger в сетевой перехватчик и мой пользовательский apikey chain.proceed(…) В другой перехватчик. Который работал как шарм, и API вызывался только один раз внутренне. Таким образом, вам нужно искать код, который, возможно, может вызвать метод chain.proceed(..) внутри. Который создает новый запрос.

Для меня сработало изменение:

 httpClient.addInterceptor(logging);
  

Для:

 httpClient.addNetworkInterceptor(logging);
  

Ответ №2:

попробуйте добавить аннотацию @Singleton в Dagger. Возможно, вы добавляете несколько регистраторов вместо одного

Комментарии:

1. Это уже как @Singleton, и он все еще ведет к перезаписи … 🙁

2. В нашем проекте мы добавили перехватчик два раза, дважды вызвав метод addInterceptor . Спасибо.