【发布时间】:2019-10-28 23:50:09
【问题描述】:
我有一个 OkHttp 拦截器,当请求收到 401 HTTP 错误时,它应该请求令牌。现在,登录服务的请求已经完成,但是链被破坏并且原始请求没有重试。 下面是我的拦截器的拦截方法:
override fun intercept(chain: Interceptor.Chain): Response {
logger.d("AuthenticationServiceHolder $authenticationServiceHolder")
val originalRequest = chain.request()
logger.d("Intercepting call to ${originalRequest.method()} ${originalRequest.url()}")
val response: Response = chain.proceed(originalRequest)
val successful = response.isSuccessful
val code = response.code()
logger.d("Response successful: $successful - code: $code")
if (!successful && code == HttpURLConnection.HTTP_UNAUTHORIZED) {
logger.d("Token is $token")
val deviceUuid = deviceIdentificationManager.deviceUuid().blockingGet()
logger.d("Device uuid $deviceUuid")
if (deviceUuid != null) {
val authenticationService = authenticationServiceHolder.get()
if (authenticationService != null) {
token = reLogin(authenticationService, deviceUuid)
if (token != null) {
val headersBuilder = originalRequest.headers().newBuilder()
headersBuilder.removeAll(AUTHORIZATION_HEADER)
headersBuilder.add(AUTHORIZATION_HEADER, token!!)
val requestBuilder = originalRequest.newBuilder()
val request = requestBuilder.headers(headersBuilder.build()).build()
return chain.proceed(request)
} else {
logger.e("Token was not retrieved")
}
} else {
logger.e("Authentication service is null!")
}
}
}
return response
}
reLogin() 方法是:
private fun reLogin(authenticationService: AuthenticationService, deviceUuid: UUID): String? {
logger.d("reLogin() - authenticationService $authenticationService")
val blockingGet = authenticationService?.login(LoginRequest(deviceUuid, clock.currentTime()))?.blockingGet()
logger.d("reLogin() - response $blockingGet")
val response = blockingGet ?: return null
logger.d("reLogin() - token ${response.token}")
return response.token
}
新: 正如Mitesh Machhoya 所说,我尝试了2 个不同的改造实例,一个有带有拦截器的okhttp 客户端,另一个没有。 现在登录调用没有被拦截但是拦截器的执行被破坏了,我的意思是这个类的日志跟踪是:
- AuthenticationServiceHolder XXXmypackageXXX.AuthenticationServiceHolder...
- Intercepting call to GET XXXmyInterceptedCallXXX
- Response successful: false - code: 401
- Token is null
- Device uuid XXX
- reLogin() - authenticationService retrofit2.Retrofit$1@a5c0a25
仅此而已。我的意思是reLogin() - response..... 没有打印出来。我确定登录调用正在工作,因为我在 okhttp 日志中看到了登录响应。
【问题讨论】:
-
okhttp Authenticator 更容易用于 401 处理和重试
标签: android kotlin retrofit retrofit2 okhttp