美文网首页Android开发经验谈Android技术知识Android开发
Okhttp入门到精通(四)-责任链模式Interceptor

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

作者: 夏天吃冰棍 | 来源:发表于2019-06-08 01:14 被阅读4次

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

上篇文章我们讲到在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<Interceptor> 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

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

  • Okhttp3 Interceptor(三)

    前言 OkHttp 中的 Interceptor 是通过责任链模式来设计的, 责任链模式参考: 责任链模式 , 至...

  • BRouter 入门

    实现 整体实现参考OkHttp的interceptor责任链模式,支持Router跳转中的认证,拦截,重定向,AB...

  • OkHttp设计模式剖析(三)策略模式

    上一篇 OkHttp设计模式剖析(二)责任链模式 下一篇 OkHttp设计模式剖析(四)享元模式 OKHTTP...

  • OkHttpClient的Interceptor们之RetryA

    OkHttpClient内部使用的是责任链模式,它里面持有多个Interceptor,每个Interceptor都...

  • 高仿okhttp手写责任链模式

    okhttp使用的设计模式面试的时候经常被问到,其中里面最多的建造者模式和责任链模式其中责任链模式也是okhttp...

  • okhttp——BridgeInterceptor

    简介 okhttp的网络请求采用interceptors链的模式。每一级interceptor只处理自己的工作,然...

  • okhttp——RetryAndFollowUpIntercep

    简介 okhttp的网络请求采用interceptors链的模式。每一级interceptor只处理自己的工作,然...

  • okhttp1

    okhttp分享一:okhttp基本使用及interceptor链 本文主要内容如下 okhttp 简介okhtt...

  • 责任链模式与 OkHttp

    什么是责任链模式 OkHttp中责任链模式的实现 一、什么是责任链模式 使多个对象都有机会处理请求,从而避免了请求...

网友评论

    本文标题:Okhttp入门到精通(四)-责任链模式Interceptor

    本文链接:https://www.haomeiwen.com/subject/uakbxctx.html