okhttp系列-拦截器的执行顺序

1.将拦截器添加到ArrayList

java 复制代码
final class RealCall implements Call {
    Response getResponseWithInterceptorChain() throws IOException {
        //将Interceptor添加到ArrayList
        List<Interceptor> interceptors = new ArrayList<>();
        interceptors.addAll(client.interceptors());
        interceptors.add(new RetryAndFollowUpInterceptor(client));
        interceptors.add(new BridgeInterceptor(client.cookieJar()));
        interceptors.add(new CacheInterceptor(client.internalCache()));
        interceptors.add(new ConnectInterceptor(client));
        if (!forWebSocket) {
            interceptors.addAll(client.networkInterceptors());
        }
        interceptors.add(new CallServerInterceptor(forWebSocket));

        //第一次的index为0
        Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter, null, 
        0, originalRequest, this, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());

        //执行请求后,得到结果
        Response response = chain.proceed(originalRequest);
        return response;
    }
}

2.拦截器的执行-责任链模式

java 复制代码
public final class RealInterceptorChain implements Interceptor.Chain {
    private final int index; //当前运行的Interceptor在ArrayList的索引

    public Response proceed(Request request, Transmitter transmitter, 
             @Nullable Exchange exchange)
      throws IOException {
        //每次index都基于上次的index +1,这样每次取得的就是下一个拦截器
        RealInterceptorChain next = new RealInterceptorChain(interceptors, transmitter, 
         exchange, index + 1, request, call, connectTimeout, readTimeout, writeTimeout);
        Interceptor interceptor = interceptors.get(index);
        //执行拦截器的方法的时候,携带了RealInterceptorChain作为参数,这样可以
        //调用这个chain的proceed
        Response response = interceptor.intercept(next);
        return response;
    }
}

3.总结

按照责任链模式执行拦截器

拦截器的执行顺序:

RetryAndFollowUpInterceptor:执行下一个拦截器,针对结果或者处理过程中的异常来进行重试或者重定向;

BridgeInterceptor:补充headers;执行下一个拦截器;处理返回的response;

CacheInterceptor:结果缓存,如果能用就返回缓存;如果不能用就执行下一个拦截器;

ConnectInterceptor:

CallServerInterceptor

相关推荐
C182981825751 天前
HttpURLConnection 是 Apache HttpClient 和 OKHttp 底层吗
okhttp·apache
C182981825752 天前
restTemplate/Feign(Spring Cloud)或OKHttp Apache HttpClient 这几个关系与底层实现
spring cloud·okhttp·apache
码到成功>_<3 天前
使用OkHttp实现接口调用
okhttp
maycho1234 天前
裂隙瓦斯模型的Comsol模拟之旅
okhttp
chilavert31811 天前
技术演进中的开发沉思-235 Ajax:动态数据(上)
javascript·ajax·okhttp
灰什么鱼12 天前
OkHttp + Retrofit2 调用第三方接口完整教程(以nomad为例)
java·spring boot·okhttp·retrofit
苏打水com13 天前
第六篇:Day16-18 AJAX进阶+接口对接——实现“前后端数据交互”(对标职场“接口开发”核心需求)
css·okhttp·html·js
漏洞文库-Web安全13 天前
CTFHub XSS通关:XSS-过滤关键词 - 教程
前端·安全·web安全·okhttp·网络安全·ctf·xss
chilavert31814 天前
技术演进中的开发沉思-229 Ajax:Firefox 与 Firebug
javascript·okhttp
chilavert31815 天前
技术演进中的开发沉思-224 Ajax面向对象与框架
javascript·okhttp