如何在Android中调用REST API之前刷新JWT令牌? 改装,Rx

问题描述

我正在使用Kotlin,RxJava(RxKotlin),翻新版开发Android应用。

我们的服务使用JWT令牌。

在发送REST API之前刷新过期的令牌并不难。

但是我的问题是...

某些UI同时调用多个REST API。

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

如果令牌已过期,我将收到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中更改刷新令牌登录。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...