Как использовать перехватчик в модификации для изменения запроса при возникновении ошибки - PullRequest
0 голосов
/ 14 февраля 2020

Я использую okhttp:3.10.0 с **retrofit:2.4.0** в моем приложении для сетевого запроса. И есть несколько запросов API, которые вызываются одновременно. Я также использую Авторизация в своем приложении, которое предоставляется бэкэндом.

Так что я хочу: Например. Если срок действия токена истек, и я получаю новый токен в перехватчике, обнаруживая реакцию на сбой. Таким образом, между тем, когда новый токен извлекается из бэкэнда, мне нужно приостановить все запросы и повторно выполнить их из перехватчика после получения нового токена аутентификации из бэкэнда.

        var isTokenUpdating = false
        val PENDING_REQUEST_LIST = arrayListOf<Request>()
        override fun intercept(chain: Interceptor.Chain): Response {
            val request = chain.request()
                    .newBuilder()
                    .addHeader("Authorization", AUTH_TOKEN_VALUE)
                    .build()
            var response = chain.proceed(request)
            val rawJSON = response.body()?.string() ?: ""


            if (isTokenUpdating) {
                PENDING_REQUEST_LIST.add(request)
            }
            val jsonObject = JSONObject(rawJSON)
            if (jsonObject.optString("errorCode") == TOKEN_EXPIRE) {
                PENDING_REQUEST_LIST.add(request)
                isTokenUpdating = true
                APIService.fetchNewToken(object : OnTokenUpdateListener {
                    override fun onTokenUpdateSuccess(newToken : String) {
                        Timber.d("onTokenUpdateSuccess, onTokenUpdateSuccess")

                        PENDING_REQUEST_LIST.forEach {
                            // retry the request
                            val requestBuild = it
                                    .newBuilder()
                                    .removeHeader("Authorization")
                                    .addHeader("Authorization", newToken)
                                    .build()
                            response = chain.proceed(requestBuild)

                        }
                    }
                    override fun onTokenUpdateError() {
                        Timber.d("onTokenUpdateError, onTokenUpdateError")
                    }
                })
            }

            return response
        }

Итак, мои требования:

  1. Удерживайте другой запрос и не возвращайте ответ для них. (Обычно я хочу отложить другие запросы до получения нового токена.)
  2. После получения нового токена я хочу повторно выполнить все ожидающие запросы, и в ответ на них они получат уведомление.

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...