Ответ 1
Используйте .interceptors()
вместо .networkInterceptors()
которые разрешены для вызова .proceed()
более одного раза.
Для получения дополнительной информации см. Https://github.com/square/okhttp/wiki/Интерцепторы
Мне нужно повторить запрос внутри OkHttp Interceptor
. Например, есть входящий запрос, для которого требуется токен Authorization
. Если срок действия маркера Authorization
истек, сервер возвращает ответ с кодом 403
. В этом случае я получаю новый токен и пытаюсь сделать вызов снова, используя тот же объект chain
.
Но OkHttp выдает исключение, в котором говорится, что вы не можете сделать два запроса с одним и тем же объектом chain
.
java.lang.IllegalStateException: network interceptor [email protected] must call proceed() exactly once
Интересно, есть ли чистое решение этой проблемы повторной попытки сетевого запроса внутри OkHttp Interceptor
?
Спасибо
public final class ApplicationApiHeaders implements Interceptor {
private static final String AUTHORIZATION = "Authorization";
private TokenProvider mProvider;
public ApplicationApiHeaders(TokenProvider provider) {
mProvider = provider;
}
@Override
public Response intercept(Chain chain) throws IOException {
Token token = mProvider.getApplicationToken();
String bearerToken = "Bearer " + token.getAccessToken();
System.out.println("Token: " + bearerToken);
Request request = chain.request();
request = request.newBuilder()
.addHeader(AUTHORIZATION, bearerToken)
.build();
Response response = chain.proceed(request);
if (!response.isSuccessful() && isForbidden(response.code())) {
Token freshToken = mProvider.invalidateAppTokenAndGetNew();
String freshBearerToken = freshToken.getAccessToken();
Request newRequest = chain.request();
newRequest = newRequest.newBuilder()
.addHeader(AUTHORIZATION, freshBearerToken)
.build();
response = chain.proceed(newRequest);
}
return response;
}
private static boolean isForbidden(int code) {
return code == HttpURLConnection.HTTP_FORBIDDEN;
}
}
Используйте .interceptors()
вместо .networkInterceptors()
которые разрешены для вызова .proceed()
более одного раза.
Для получения дополнительной информации см. Https://github.com/square/okhttp/wiki/Интерцепторы