Сценарий. Я использую OkHttp/Retrofit для доступа к веб-службе: одновременно отправляются несколько HTTP-запросов. В какой-то момент токен аутентификации истекает, и несколько запросов получат ответ 401.
Проблема. В моей первой реализации я использую перехватчик (здесь упрощенный), и каждый поток пытается обновить токен. Это приводит к беспорядку.
public class SignedRequestInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// 1. sign this request
request = request.newBuilder()
.header(AUTH_HEADER_KEY, BEARER_HEADER_VALUE + token)
.build();
// 2. proceed with the request
Response response = chain.proceed(request);
// 3. check the response: have we got a 401?
if (response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
// ... try to refresh the token
newToken = mAuthService.refreshAccessToken(..);
// sign the request with the new token and proceed
Request newRequest = request.newBuilder()
.removeHeader(AUTH_HEADER_KEY)
.addHeader(AUTH_HEADER_KEY, BEARER_HEADER_VALUE + newToken.getAccessToken())
.build();
// return the outcome of the newly signed request
response = chain.proceed(newRequest);
}
return response;
}
}
Желаемое решение: все потоки должны ждать обновления одного токена: первый запрос об ошибке запускает обновление, а вместе с другими запросами ждет новый токен.
Что такое хороший способ для этого? Могут ли помочь некоторые встроенные функции OkHttp (например, Authenticator)? Спасибо за любой намек.