the*_*del 5 android kotlin retrofit okhttp okhttp3
我有一个这样的身份验证器
@Singleton
class TokenAutheticator @Inject constructor(private val tokenHolder: Lazy<TokenHolder>,private val tokenInterceptor: TokenInterceptor):Authenticator {
override fun authenticate(route: Route?, response: Response): Request? {
val resp = tokenHolder.get().tokenService.relogin(tokenInterceptor.token).execute()
println("### res "+resp.code())
if (resp.code()==200) {
val body = tokenHolder.get().tokenService.relogin(tokenInterceptor.token).execute()?.body()
val newToken = body?.token
println("########## authenticator ########## ")
val url = route?.address()?.url()?.newBuilder()?.addQueryParameter("token", newToken)?.build()
return response.request().newBuilder().url(url).build()
}else{
return null
}
}
}
Run Code Online (Sandbox Code Playgroud)
当resp.code != 200Authenticator 被多次调用时。我像这样将它插入 Okhttp
@Provides
@Singleton
fun provideOkhttp(tokenInterceptor: TokenInterceptor, tokenAutheticator: TokenAutheticator): OkHttpClient {
val logging = HttpLoggingInterceptor()
logging.setLevel(HttpLoggingInterceptor.Level.BODY)
val client = OkHttpClient.Builder()
.authenticator(tokenAutheticator)
.addInterceptor(logging)
.addInterceptor(tokenInterceptor)
.build()
return client
}
Run Code Online (Sandbox Code Playgroud)
所以我想要做的是让 Authenticator 只尝试一次,如果它能够获得新令牌,那么从现在开始使用新令牌,如果它无法获得新令牌,则退出。但是 Authenticator 被多次调用,并且 API 以太多的尝试作为响应。任何帮助表示赞赏。谢谢
仅当您返回时null,Authenticator才会停止被呼叫(停止重试身份验证)。
由于您总是返回一些内容,因此当响应代码为 200 时,它会被调用几次。幸运的是,据我了解,Authenticator检测到你的无限循环,并最终摆脱它。
基本上,您应该用来Authenticator对 401(和类似)响应代码做出反应,并且在这种情况下仅添加授权标头。
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |