Я сталкиваюсь с очень странной проблемой в моем 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
Сегодня я также много искал по этому вопросу, но не смог найти никакой связи между уровнями журналирования, мешающей другим перехватчикам. Буду признателен за любую помощь, и если вам нужно больше кода, я могу опубликовать его.