在android中调用RESTAPI之前,如何刷新JWT令牌?(改装,Rx)

在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

我正在使用Kotlin、RxJava(RxKotlin)改进版开发一个android应用程序

我们的服务使用JWT令牌

在发送RESTAPI之前,刷新过期的令牌并不困难

但我的问题是

某些UI同时调用多个REST API

例如,5个API请求同时发送到MainActivity中的服务器

如果令牌已经过期,我将收到5个带有401 http错误代码的错误(令牌已过期)

但在我的例子中,我检查令牌是否过期

如果令牌过期,我将尝试刷新令牌

因此,在本例中,我发送了5个刷新令牌的请求

然后。。。我将获得5个新的JWT代币

我的好主意是

在发送5个REST请求之前,我可以检查令牌是否过期

但问题是。。。我有很多这样的UI

所以我需要一个更漂亮的方法

我认为这种代码(在UI中发送请求之前检查令牌)可以解决我的问题

但是这个代码是多余的,样板代码

我想用一个入口来解决这个问题


我真的很抱歉我愚蠢的英语技能。

你可以集中处理这种情况
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
            }                
        }
    })