okHttp 二 拦截器解析及责任链模式

来源:互联网 发布:js while循环,1加到n 编辑:程序博客网 时间:2024/05/12 05:23

责任链模式:(Android的事件分发机制也是基于此模式)

百度给出的定义 
责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

职责链模式的主要优点在于可以降低系统的耦合度,简化对象的相互连接,同时增强给对象指派职责的灵活性,增加新的请求处理类也很方便;其主要缺点在于不能保证请求一定被接收,且对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。


Okhttp连接链:

RetryAndFollowupInterceptor从错误中恢复以及重定向,创建了StreamAllocation

1、首先查看请求是否已经取消

2、调用RealInterceptorChain的proceed处理这个请求并把刚创建的StreamAllocation传递进去

3、如果前面第二步没有出现异常,则说明请求完成,设置releaseConnection为false,出现异常则将releaseConnection置为true,并释放前面创建的StreamAllocation

4、priorResponse不为空,则说明前面已经获取到了响应,这里会结合当前获取的Response和先前的Response

5、调用followUpRequest查看响应是否需要重定向,如果不需要重定向则返回当前请求

6、重定向次数+1,并且判断StreamAllocation是否需要重新创建

7、重新设置request,并把当前的Response保存到priorResponse,继续while循环


BridgeInterceptor从用户的请求构建网络请求,然后提交给网络,最后从网络响应中提取出用户响应,实现了适配的功能

主要流程如下

1、获取请求,请求的body,根据body的长度进行相关的 头

2、其他一些头的设置,如"User-Agent"、"Connection"等

3、调用chain.proceed(requestBuilder.build());传递给下一个拦截器进行处理,并返回Response

4、是否有cookie,响应是否使用了gzip,如果有的话重新设置响应的body

这样BridgeInterceptor就执行完了,从代码中也可以看到,他主要是在请求之前对响应头做了一些检查,并添加一些头,然后在请求之后对响应做一些处理


CacheInterceptor尝试从缓存中获取响应,如果可以获取到,则直接返回;否则将进行网络操作获取响应

具体流程大概如下:

1、首先判断用户是否有设置cache,如果有的话,则从用户的cache中获取当前请求的缓存,用户可以通过如下方式设置cache

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. OkHttpClient mOkHttpClient = new OkHttpClient();  
  2.       mOkHttpClient.newBuilder().cache(new Cache(new File("D:"),1024*1024));  
InternalCache是不能直接使用的,而Cache可以直接使用,它里面自己实现了InternalCache
2、然后根据前面是否有缓存已经当前请求构造一个CacheStrategy,它的networkRequest代表当前请求,cacheResponse代表当前缓存响应

3、如果networkRequest为空则说明不需要网络请求,直接返回当前缓存

4、调用 networkResponse = chain.proceed(networkRequest)处理当前请求

5、如果缓存不为空,调用validate进行验证,是否需要更新缓存

6、如果缓存为空,则保存当前缓存


ConnectInterceptor 利用之前创建的StreamAllocation,获取HttpStream对象以及RealConnection对象,继续给下面的拦截器处理,下一个拦截器中proceed中的后三个参数均不为null了

CallServerInterceptor负责将网络请求提交给服务器,操作HttpStream进行发送请求和读取响应



0 0
原创粉丝点击