在android中调用RESTAPI之前,如何刷新JWT令牌?(改装,Rx)
我正在使用Kotlin、RxJava(RxKotlin)改进版开发一个android应用程序 我们的服务使用JWT令牌 在发送RESTAPI之前,刷新过期的令牌并不困难 但我的问题是 某些UI同时调用多个REST API 例如,5个API请求同时发送到MainActivity中的服务器 如果令牌已经过期,我将收到5个带有401 http错误代码的错误(令牌已过期) 但在我的例子中,我检查令牌是否过期 如果令牌过期,我将尝试刷新令牌 因此,在本例中,我发送了5个刷新令牌的请求 然后。。。我将获得5个新的JWT代币 我的好主意是 在发送5个REST请求之前,我可以检查令牌是否过期 但问题是。。。我有很多这样的UI 所以我需要一个更漂亮的方法 我认为这种代码(在UI中发送请求之前检查令牌)可以解决我的问题 但是这个代码是多余的,样板代码 我想用一个入口来解决这个问题在android中调用RESTAPI之前,如何刷新JWT令牌?(改装,Rx),android,kotlin,jwt,retrofit,rx-java,Android,Kotlin,Jwt,Retrofit,Rx Java,我正在使用Kotlin、RxJava(RxKotlin)改进版开发一个android应用程序 我们的服务使用JWT令牌 在发送RESTAPI之前,刷新过期的令牌并不困难 但我的问题是 某些UI同时调用多个REST API 例如,5个API请求同时发送到MainActivity中的服务器 如果令牌已经过期,我将收到5个带有401 http错误代码的错误(令牌已过期) 但在我的例子中,我检查令牌是否过期 如果令牌过期,我将尝试刷新令牌 因此,在本例中,我发送了5个刷新令牌的请求 然后。。。我将获得5
我真的很抱歉我愚蠢的英语技能。你可以集中处理这种情况
OkHttpClient
有一个名为authenticator()
的方法。当任何响应获得未经授权的异常时,将调用它。下面是一个示例(我在这里使用kotlin):
添加此客户端以进行改装。您必须在此
身份验证器中更改刷新令牌登录
您可以集中处理此情况OkHttpClient
有一个名为authenticator()
的方法。当任何响应获得未经授权的异常时,将调用它。下面是一个示例(我在这里使用kotlin):
添加此客户端以进行改装。您必须更改此
验证器中的刷新令牌登录名
您是否在改装实例中添加了任何OkHttpClient
?@shafayathossain,确保它是必需的,对吗?您是否在改装实例中添加了任何OkHttpClient
?@shafayathossain,确保它是必需的,对吗?您的答案是最好的答案!但它不能解决我的问题。因为我们的服务使用的是错误代码460而不是401。但我可以从你的回答中找到暗示。我用拦截器解决了这个问题。谢谢你,你的答案是最好的答案!但它不能解决我的问题。因为我们的服务使用的是错误代码460而不是401。但我可以从你的回答中找到暗示。我用拦截器解决了这个问题。非常感谢。
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
}
}
})