HttpLoggingInterceptor, взаимодействующий с механизмом refre sh token - PullRequest
2 голосов
/ 19 марта 2020

Я сталкиваюсь с очень странной проблемой в моем Android приложении с OkHttp3 Interceptor, где я устанавливаю разные уровни ведения журнала для разных вариантов сборки.

У меня есть OkHttp3 Interceptor в моем приложении для перехвата запросов API, и если какой-либо API возвращает ошибку 401, перехватчик получает обновленный токен из серверной части, обновляет заголовок исходного запроса новым токеном и повторяет его. Давайте назовем это RefreshTokenInterceptor . Я добавляю этот перехватчик при создании моего OKHttpClient. Кроме того, я также добавляю HttpLoggingInterceptor для регистрации запросов и ответов API или прекращения регистрации в случае выпусков сборки. Давайте назовем это LoggingInterceptor

Вот код, где я строю свой OkHttpClient. Этого кода должно быть достаточно, потому что механизм refre sh работает нормально, если уровень ведения журнала изменяется.

val loggingInterceptor = HttpLoggingInterceptor()

// changing level to Level.BODY in the below solves the issue,
// but I don't want to log the results
when {
        BuildConfig.DEBUG -> loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
        else -> loggingInterceptor.level = HttpLoggingInterceptor.Level.NONE
}

val httpClientBuilder = OkHttpClient.Builder()
      .readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS)
      .writeTimeout(WRITE_TIMEOUT, TimeUnit.MILLISECONDS)
      .addInterceptor(ConnectivityInterceptor())
      .addInterceptor(TokenRefreshInterceptor())
      .addInterceptor(loggingInterceptor)
      .connectTimeout(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)

Когда я устанавливаю уровень ведения журнала LoggingInterceptor в обоих случаях на Level.BODY, все отлично работает. Но в случае уровня ведения журнала, установленного на Level.NONE, механизм токена refre sh перестает работать.

Чтобы быть более точным c, в данном случае это то, что происходит в RefreshTokenInterceptor : когда запрос возвращает 401, выполняется вызов refre sh, но после этого ничего не происходит. Случай успеха или неудачи не вызывается (возможно, перехватчик Chain ломается, но кто знает).

Вот что я пробовал до сих пор

  • Удаление LoggingInterceptor в целом -> не работает
  • Установка уровня ведения журнала на Level.NONE для всех вариантов сборки -> не работает
  • Установка уровня ведения журнала на Level.BODY для всех вариантов сборки -> работает как magi c

Сегодня я также много искал по этому вопросу, но не смог найти никакой связи между уровнями журналирования, мешающей другим перехватчикам. Буду признателен за любую помощь, и если вам нужно больше кода, я могу опубликовать его.

1 Ответ

1 голос
/ 20 марта 2020

Проблема была вызвана утечкой памяти из-за объекта OkHttp3 Response в TokenRefreshInterceptor, который не был закрыт. Я узнал об этой утечке на Firebase Console. Закрытие этого Response после потребления решило проблему. Но я все еще не уверен, почему он работал нормально, когда я включил ведение журнала на уровне тела.

...