HttpLoggingInterceptor干扰刷新令牌机制

问题描述 投票:1回答:1

我在Android应用程序OkHttp3 Interceptor中遇到一个非常奇怪的问题,在该应用程序中我为不同的构建变体设置了不同的日志记录级别。

我在我的应用中设置了OkHttp3 Interceptor来拦截API请求,如果任何API返回401错误,则拦截器将从后端获取刷新的令牌,并使用新令牌更新原始请求的标头,并重复一遍。我们将此称为RefreshTokenInterceptor。我在构建我的OKHttpClient时添加了这个拦截器。除此之外,我还添加了一个HttpLoggingInterceptor来记录API请求和响应,或者在发布版本的情况下停止记录。我们称之为LoggingInterceptor

这里是构建我的OkHttpClient的代码。此代码应该足够,因为如果更改了日志记录级别,则刷新机制可以正常工作。

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,则令牌刷新机制将停止工作。

更具体地说,在这种情况下,这就是RefreshTokenInterceptor中发生的事情:当请求返回401时,将进行刷新调用,但此后没有任何反应。没有成功或失败的案例被调用(可能拦截器Chain中断了,但谁知道)。

这是我到目前为止尝试过的

  • 完全删除LoggingInterceptor->不起作用
  • 将所有构建版本的日志记录级别设置为Level.NONE->不起作用
  • 将所有构建版本的日志记录级别设置为Level.BODY->可以像魔术一样

今天我也对此进行了很多搜索,但是找不到混淆其他拦截器的日志记录级别之间的任何链接。任何帮助将不胜感激,如果您需要更多代码,我可以将其发布。

android okhttp interceptor
1个回答
0
投票

此问题是由于内存泄漏引起的,这是因为OkHttp3中的Response TokenRefreshInterceptor对象没有关闭。我知道有关Firebase Console的泄漏。在使用完Response之后将其关闭即可解决此问题。但是我仍然不确定为什么在启用身体级别的日志记录时它可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.