Как предотвратить повторный вызов Ohttp Authenticator? - PullRequest
3 голосов
/ 11 апреля 2019

У меня есть такой аутентификатор

@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
        }
    }


}

Когда resp.code != 200 Аутентификатор вызывается несколько раз. Я подключаю его в Охттп вот так

@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
}

Итак, я хочу, чтобы Аутентификатор попробовал его только один раз, и если он может получить новый токен, используйте новый токен с этого момента, и если он не может получить новый токен, выйдите. Но Authenticator вызывается несколько раз, и API отвечает слишком многими попытками. Любая помощь приветствуется. Спасибо

...