java - 通过 OkHttp 拦截器拦截和重试调用

标签 java retrofit okhttp interceptor

我需要在 OkHttp Interceptor 内重试请求。例如,有一个需要 Authorization token 的传入请求。如果 Authorization token 已过期,服务器将返回带有 403 代码的响应。在这种情况下,我正在检索一个新 token 并尝试使用相同的 chain 对象再次进行调用。

但是 OkHttp 会抛出一个异常,指出你不能使用相同的 chain 对象发出两个请求。

java.lang.IllegalStateException: network interceptor org.app.api.modules.ApplicationApiHeaders@559da2 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://square.github.io/okhttp/interceptors/

关于java - 通过 OkHttp 拦截器拦截和重试调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28536522/

相关文章:

java - 使用静态方法泛型时不兼容的类型

java - csc -version 正在终端中运行,但不是从我的 java 程序 MAC 运行

android - 尝试使用 Retrofit 在没有正文的情况下进行 POST,但因 GSON 解析异常而失败

android - Kotlin Android Retrofit 2.6.0 与协程错误处理

android - 使用 Retrofit 库获取时出错

android - okHttp 是 Android 的一部分吗?

java - Proguard 生成错误的字符串资源 ID

java - 如何将参数传递给jsp :include

android - 如何从 okhttp3 缓存中删除条目

java - JSON 数组中的参数