OkHttp Перехватчик прерван при получении токена - PullRequest
0 голосов
/ 14 июня 2019

У меня есть перехватчик OkHttp, который должен запрашивать токен, когда запрос получает ошибку 401 HTTP.Теперь запрос на обслуживание входа в систему выполнен, но затем цепочка разорвана и исходный запрос не повторяется.Вот метод перехвата моего перехватчика:

override fun intercept(chain: Interceptor.Chain): Response {
        logger.d("AuthenticationServiceHolder $authenticationServiceHolder")

        val originalRequest = chain.request()
        logger.d("Intercepting call to ${originalRequest.method()} ${originalRequest.url()}")

        val response: Response = chain.proceed(originalRequest)
        val successful = response.isSuccessful
        val code = response.code()
        logger.d("Response successful: $successful - code: $code")

        if (!successful && code == HttpURLConnection.HTTP_UNAUTHORIZED) {
            logger.d("Token is $token")

            val deviceUuid = deviceIdentificationManager.deviceUuid().blockingGet()
            logger.d("Device uuid $deviceUuid")
            if (deviceUuid != null) {
                val authenticationService = authenticationServiceHolder.get()
                if (authenticationService != null) {
                    token = reLogin(authenticationService, deviceUuid)
                    if (token != null) {
                        val headersBuilder = originalRequest.headers().newBuilder()
                        headersBuilder.removeAll(AUTHORIZATION_HEADER)
                        headersBuilder.add(AUTHORIZATION_HEADER, token!!)

                        val requestBuilder = originalRequest.newBuilder()
                        val request = requestBuilder.headers(headersBuilder.build()).build()
                        return chain.proceed(request)
                    } else {
                        logger.e("Token was not retrieved")
                    }
                } else {
                    logger.e("Authentication service is null!")
                }
            }
        }
        return response
}

Метод reLogin ():

private fun reLogin(authenticationService: AuthenticationService, deviceUuid: UUID): String? {
        logger.d("reLogin() - authenticationService $authenticationService")
        val blockingGet = authenticationService?.login(LoginRequest(deviceUuid, clock.currentTime()))?.blockingGet()
        logger.d("reLogin() - response $blockingGet")
        val response = blockingGet ?: return null
        logger.d("reLogin() - token ${response.token}")
        return response.token
}

NEW: как Митеш Махойя говорит, что япробовал с 2 разными экземплярами дооснащения, у одного клиент okhttp с перехватчиком, а у другого его нет.И теперь вызов входа в систему не перехватывается, но выполнение Interceptor прерывается, я имею в виду трассировку журнала этого класса:

 - AuthenticationServiceHolder XXXmypackageXXX.AuthenticationServiceHolder... 
 - Intercepting call to GET XXXmyInterceptedCallXXX 
 - Response successful: false - code: 401 
 - Token is null 
 - Device uuid XXX 
 - reLogin() - authenticationService retrofit2.Retrofit$1@a5c0a25 

И ничего более.Я имею в виду reLogin() - response..... не печатается.Я уверен, что входящий вызов работает, потому что я вижу ответный вход в журнал okhttp.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Вставленный код работает хорошо, запрос на вход в систему работает, но ответ входа в систему был изменен на стороне сервера, и десериализация привела к его аварийному завершению, и это нарушило цепочку.

0 голосов
/ 14 июня 2019

Сделайте запрос reLogin с другим httpClient, не подключая перехватчик, тогда он будет работать так, как вы ожидали.

Если вы сделаете запрос reLogin с тем же httpClient, то он пройдет через перехватчик и каждый раз будет отменять запрос, поэтому попробуйтесделать запрос, используя другой httpClient

...