首页 > 解决方案 > 来自拦截器令牌的召回 http 请求无效

问题描述

我们在 API 中使用令牌,当任何 HTTP 请求时,我们检查令牌是否处于活动状态,如果令牌不处于活动状态,我们会在 intereceptor 中获取一次新的

if (resultObj.code == AppConstants.TOKEN_IS_NOT_ACTIVE)
        getTokenOnce()

但我怎样才能得到那个请求(可以是订单,报告......)并再次发布到服务器

标签: javaandroidkotlinretrofitretrofit2

解决方案


目前尚不清楚如何在 api 中进行令牌身份验证,因此我将仅举一个使用不记名令牌身份验证类型的示例。

okhttp 拦截器的签名是:

fun intercept(chain: Interceptor.Chain): Response

在里面chain你会找到原始请求。这可能看起来像的一种方式是:

override fun intercept(chain: Interceptor.Chain): Response {
   val originalRequest = chain.request
   var response = chain.proceed(originalRequest)

   if (response.code == AppConstants.TOKEN_IS_NOT_ACTIVE) {
      val token = getTokenOnce()
      val newRequest = originalRequest.newBuilder()
                          .header("Authorization", "Bearer $token")
                          .build()
      response = chain.proceed(newRequest)
   }

   return response
}

所以这里的想法是从原始请求创建一个新请求newBuilder()- 并添加一个带有新令牌的标头。我假设getTokenOnce可以将新令牌作为字符串返回。也许这需要稍微调整一下。

最后,您再次处理请求。

要记住的一件事是,在设置拦截器时,需要将其设置为应用程序拦截器,而不是网络拦截器。网络拦截器不允许您进行多次。


推荐阅读