【问题标题】:OkHttp token interceptor retries foreverOkHttp 令牌拦截器永远重试
【发布时间】:2018-09-23 08:12:18
【问题描述】:

我正在制作一个 OkHttp 拦截器,因此它会在任何端点返回 401 错误时重试登录,但拦截器会永远循环。

我也尝试添加一个计数器,但计数器每次都会自行重置。

这是我的代码:

object Service {

    private fun getOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder()
                .addInterceptor(getLoggingInterceptor())
                .addInterceptor(NetworkInterceptor())
                .build()
    }

    private fun getRetrofit(): Retrofit {
        return Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(getOkHttpClient())
                .baseUrl(getBaseUrl())
                .build()
    }
}

class NetworkInterceptor: Interceptor {
    var counter = 0

    override fun intercept(chain: Interceptor.Chain): Response? {
        val originalResponse = chain.proceed(chain.request())

        if (!originalResponse.isSuccessful && originalResponse.code() == 401) {
            Log.e("NetworkInterceptor", "Network error 401. Counter = $counter")
            counter++

            val refreshedToken = refreshToken()
            Log.e("NetworkInterceptor", "refreshedToken = $refreshedToken")
        }


        return originalResponse
    }

    private fun refreshToken(): String {
        val context = MyApp.appContext
        val preferencesUtil = SharePreferencesUtils(context)
        val username = preferencesUtil.getUsername()
        val password = preferencesUtil.getPassword()
        val login = AuthService().loginSync(username, password).execute()
        return login.body()?.access_token!!
    }
}

我已经尝试过使用 RxJava Single 和常规同步 Call<> 的 Auth 调用

在每种情况下,调用永远发生,401 永远返回,计数器始终保持在 0。

对我遗漏或做错了什么有任何想法?

非常感谢!

【问题讨论】:

  • 我不确定其余部分是如何工作的,但您不应该以某种方式将令牌添加到请求中吗? client.addInterceptor { it -> val request = it.request() val authRequest = request .newBuilder() .header("Authorization", refreshToken()) .build() return@addInterceptor it.proceed(authRequest) }跨度>
  • 我认为不需要。我的登录调用已经在标题中添加了它
  • 看起来你正在处理上一个请求,然后你刷新你的令牌(并且什么都不做)并返回失败的请求。您应该使用chain.request() 获取当前请求,然后将刷新的令牌添加到请求中,然后调用chain.proceed(使用您的新请求)
  • 你是否真的检查了请求中是否添加了标头@TooManyEduardos
  • 好吧,我得到了这个循环,即使是最初的登录调用。所以,如果第一个用户名/密码组合无效,我仍然会陷入循环。这是针对令牌甚至还不存在的情况

标签: android kotlin retrofit2 rx-java2 okhttp3


【解决方案1】:

使用添加为 NetworkInterceptor

addNetworkInterceptor(NetworkInterceptor)

请参阅此链接以获得进一步说明:https://github.com/square/okhttp/wiki/Interceptors

【讨论】:

    猜你喜欢
    • 2017-02-25
    • 2015-04-16
    • 2019-10-28
    • 1970-01-01
    • 2020-09-18
    • 2017-12-25
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多