3

对于两个不同的 API,我有两个不同Retrofit的实例。我也有两个不同OkHttp3的客户端,但它们共享相同Authenticator,因为两个 API 的身份验证令牌相同。

问题是,当令牌过期时,有时(但几乎总是)其中一个Retrofit/OkHttpClient对象不会在 HTTP 401 上调用Authenticator'authenticate方法。它会愉快地进行 API 调用,所有都将以 401 结束,并且身份验证器被完全忽略。在这种情况下,当第二个Retrofit进行 API 调用时,它将收到 401 并被authenticate调用,令牌被刷新,一切恢复正常。包括第二个RetrofitAPI,它以 401 失败所有调用。

更大的问题是这种行为是随机的,但失败的原因是超过一半的令牌过期。我们已经尝试了两个Retrofit实例,一个共享OkHttp3客户端,两个OkHttp3客户端共享拦截器和验证器,最后还有非共享拦截器和验证器。即使在最后一种情况下,所有事物都有自己的实例,在某些 401 错误上也不会调用身份验证。

Interceptors 工作,他们将旧令牌注入标头,只是Authenticator'authenticate方法不会在每个 HTTP 401 错误上调用。

单步执行调试器时,这永远不会发生,并且始终会调用身份验证。这对我来说似乎是一个多线程问题。Android Studio 中禁用了即时运行。在装有 Android 6 的真实设备上运行。

编辑: OkHttp 3.10.0、Retrofit 2.4.0、android 编译 SDK 27 和构建工具 28.0.1

4

0 回答 0