Okhttp入门到精通(四)-责任链模式Interceptor

本文为个人学习笔记分享,没有任何商业化行为,对其他文章的引用都会标记。如有侵权行为,请及时提醒更正!如需转载请表明出处。

上篇文章我们讲到在AsyncCall的execute方法中:
1.执行请求获取Response
2.判断是否被取消,如果取消,回调onFailure()函数,并抛出IO异常
否则回调成功
3.最终将该任务线程移除Dispatcher线程队列

Okhttp入门到精通(三)-调度器Dispatcher
问题:Okhttp是如何执行请求获取Response?

 final class AsyncCall extends NamedRunnable {
      ....
       //TODO 拦截器链  执行请求
       Response response = getResponseWithInterceptorChain();
      ....
 }
Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    //TODO 7、责任链 倒序调用
    List interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    //TODO 6、处理重试与重定向
    interceptors.add(retryAndFollowUpInterceptor);
    //TODO 5、处理 配置请求头 请求体等信息
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    //TODO 4、处理 缓存配置 根据条件(存在响应缓存并被设置为不变的或者响应在有效期内)返回缓存响应
    //TODO 3、设置请求头(If-None-Match、If-Modified-Since等) 服务器可能返回304(未修改)
    interceptors.add(new CacheInterceptor(client.internalCache()));
    //TODO 2、连接服务器
    interceptors.add(new ConnectInterceptor(client));
    if (!forWebSocket) {
      interceptors.addAll(client.networkInterceptors());
    }
    //TODO 1、执行流操作(写出请求体、获得响应数据)
    interceptors.add(new CallServerInterceptor(forWebSocket));

    Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
        originalRequest, this, eventListener, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());

    return chain.proceed(originalRequest);
  }

Okhttp 采用责任链模式去请求Response
关于责任链模式不过多赘述,请参阅该文档

一、Intercepotor拦截器

在执行请求过程中,会创建大量的拦截器去执行请求,采用责任链模式
1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
在getResponseWithInterceptorChain()方法中,创建 interceptors拦截器队列:
1. RetryAndFollowUpInterceptor 处理重试与重定向
2. BridgeInterceptor 处理 配置请求头 请求体等信息
3.CacheInterceptor 处理 缓存配置
4. ConnectInterceptor 连接服务器
5. CallServerInterceptor 执行流操作(写出请求体、获得响应数据)

//在getResponseWithInterceptorChain()方法中创建拦截器链,并将index
//传入0调用getResponseWithInterceptorChain()方法
Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
        originalRequest, this, eventListener, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());
chain.proceed(originalRequest)

public Response proceed(Request request, StreamAllocation streamAllocation, HttpCodec httpCodec,
      RealConnection connection) throws IOException {
      ............................
    //创建新的拦截链,链中的拦截器集合index+1
    // Call the next interceptor in the chain.
    RealInterceptorChain next = new RealInterceptorChain(interceptors, streamAllocation, httpCodec,
        connection, index + 1, request, call, eventListener, connectTimeout, readTimeout,
        writeTimeout);
    //执行当前的拦截器 默认是:retryAndFollowUpInterceptor
    Interceptor interceptor = interceptors.get(index);
    Response response = interceptor.intercept(next);
    return response;
}

在拦截器中责任链对象proceed()中:
1.创建新的拦截器链,链条中的index+1
2.从拦截器集合中获取角标为index的拦截器
3.执行拦截器的intercept方法.

所以最终的逻辑就是CallServerInterceptor->ConnectInterceptor->CacheInterceptor->BridgeInterceptor->retryAndFollowUpInterceptor->Response;

拦截器的执行逻辑

你可能感兴趣的:(Okhttp入门到精通(四)-责任链模式Interceptor)