[TOC]
Okhttp深入2-请求执行内核:拦截器
0. 核心工作:拦截器
在经过dispatcher的分发之后,请求任务终于来到要执行工作的步骤, 在源码中我们可以看到它的核心工作方法在getResponseWithInterceptorChain ()
中,在该方法内,为我们的请求任务创建了一条任务链,串联了5大默认拦截器(也可转载自定义拦截器),
![](https://img.haomeiwen.com/i3026588/35f1ab67b39604ce.png)
![](https://img.haomeiwen.com/i3026588/1bbd57a1cd8dc19a.png)
![](https://img.haomeiwen.com/i3026588/d2123a8f6e412e4e.png)
RetryAndFollowUpInterceptor
1. 重试与重定向拦截器:RetryAndFollowUpInterceptor
职责:负责请求的重试,及需要重定向情况下的重定向请求
拦截方法:针对抛出的RouteException
及IOException
处理,判断需不需要重试,正常交付给下一链BridgeInterceptor
![](https://img.haomeiwen.com/i3026588/e85fd7a0abb67231.png)
2. 桥接拦截器:BridgeInterceptor
职责:连接应用程序和服务器的桥梁,我们发出的请求将会经过它的处理才能发给服务器,在收到结果时进行处理(如gzip解压缩)
拦截方法:在这里处理了一系列的操作;补全请求头、设置编码、gzip压缩等;正常交付给下一链CacheInterceptor
![](https://img.haomeiwen.com/i3026588/0256b3fef7ca7f19.png)
3. 缓存拦截器:CacheInterceptor
职责:在发出请求前,判断是否使用缓存,在收到响应后,判断是否需要缓存
拦截方法:缓存处理后交由下一链ConnectInterceptor
![](https://img.haomeiwen.com/i3026588/a7faab3ba9cb45f7.png)
4. 连接拦截器:ConnectInterceptor
职责:打开与目标服务器的连接,并执行下一个拦截器
拦截方法:获得一份与目标服务器的连接,在这个连接上进行HTTP数据的收发,交付下一链CallServerInterceptor
![](https://img.haomeiwen.com/i3026588/269c86219e72d1aa.png)
5. 请求服务器拦截器:CallServerInterceptor
职责:在连接上进行发送接受数据
拦截方法:完成HTTP协议报文的封装与解析,将结果回传,至此请求与响应完成,只剩对响应的处理![](https://img.haomeiwen.com/i3026588/5274fc5a9a4ac4a9.png)
6. 总结
5大拦截器,各自分工,通过责任链模式完成了各自需要处理的部分,同时交付给下一环,在完成请求之后,对结果处理并交付给上一环,对于发送者与接受者进行了解耦,同时整理流程逻辑清晰,NICE!
网友评论