【发布时间】: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