Я использую 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
}
Итак, мои требования:
- Удерживайте другой запрос и не возвращайте ответ для них. (Обычно я хочу отложить другие запросы до получения нового токена.)
- После получения нового токена я хочу повторно выполнить все ожидающие запросы, и в ответ на них они получат уведомление.
Заранее спасибо