我正在使用Kotlin、RxJava(RxKotlin(和Reform开发一个android应用程序。
我们的服务使用JWT代币。
在发送REST API之前,刷新过期的令牌并不困难。
但我的问题是。。。
某些UI同时调用多个REST API。
例如,5个API请求同时发送到MainActivity中的服务器。
如果令牌已经过期,我将收到5个错误,其中401 http错误代码(令牌过期(。
但在我的情况下,我会检查令牌是否过期。
如果令牌已过期,我会尝试刷新令牌。
因此,在本例中,我发送了5个刷新令牌的请求。
然后。。。我将获得5个新的JWT代币。。。
我的好主意是。。。
在发送5个REST请求之前,我可以检查令牌是否过期。
但问题是…我有很多这样的UI。
所以我需要一个更美丽的方式。
我认为这种代码(在UI中发送请求之前检查令牌(可以解决我的问题。
但这个代码是多余的,样板代码。。。
我只想通过一个入口来解决这个问题。
我真的为我愚蠢的英语技能感到抱歉
您可以集中处理这种情况。OkHttpClient
有一个方法,称为authenticator()
。当任何响应出现未经授权的异常时,都会调用它。一个例子如下(我在这里使用kotlin(:
OkHttpClient.Builder()
.authenticator(object: Authenticator {
override fun authenticate(route: Route?, response: Response): Request? {
if(response.code == 401) {
// build retrofit client manually and call refresh token api
val refreshTokenService = retrofitClient.create(RefreshTokenService::class.java)
val refreshTokenResponse = refreshTokenService.refreshToken().execute()
val token = refreshTokenResponse.body().token
return response.request.newBuilder().header("Authorization", token).build()
} else {
return response.request
}
}
})
将此客户端添加到改造中。您必须更改此authenticator
中的刷新令牌登录。