一、重试和重定向拦截器
重试的前提是出现了或者。一但在后续的拦截器执行过程中出现这两个异常,就会通过方法进行判断是否进行连接重试。
重定向发生在重试的判定之后,一般服务器在返回3XX的错误码,并且会携带Location的响应头就会发生重定向的操作,如果不满足重试的条件,还需要进一步调用根据 的响应码(当然,如果直接请求失败,都不存在就会抛出异常)。最大发生20次。
二、桥接拦截器
BridgeInterceptor,连接应用程序和服务器的桥梁,我们发出的请求将会经过它的处理才能发给服务器,比如设置请求内容长度,编码,gzip压缩,cookie等,获取响应后保存Cookie等操作。这个拦截器相对比较简单。
补全请求头:
在补全了请求头后交给下一个拦截器处理,得到响应后,主要干两件事情:
1、保存cookie,在下次请求则会读取对应的数据设置进入请求头,默认的不提供实现
2、如果使用gzip返回的数据,则使用包装便于解析。
总结
桥接拦截器的执行逻辑主要就是以下几点
对用户构建的进行添加或者删除相关头部信息,以转化成能够真正进行网络请求的 将符合网络请求规范的Request交给下一个拦截器处理,并获取 如果响应体经过了GZIP压缩,那就需要解压,再构建成用户可用的并返回
三、缓存拦截器
CacheInterceptor,在发出请求前,判断是否命中缓存。如果命中则可以不请求,直接使用缓存的响应。 (只会存在Get请求的缓存)
步骤为:
1、从缓存中获得对应请求的响应缓存
2、创建 ,创建时会判断是否能够使用缓存,在 中存在两个成员:与。他们的组合如下:
3、交给下一个责任链继续处理
4、后续工作,返回304则用缓存的响应;否则使用网络响应并缓存本次响应(只缓存Get请求的响应)


缓存拦截器的工作说起来比较简单,但是具体的实现,需要处理的内容很多。在缓存拦截器中判断是否可以使用缓存,或是请求服务器都是通过判断。
四、连接拦截器
,打开与目标服务器的连接,并执行下一个拦截器。
拦截池,保存了一些socket连接,供请求复用。针对同一域名的请求可以复用相同的socket连接。拦截池最多保存5个连接,每个连接最多保存5分钟。
如果是https连接,需要先发送一个connect请求,待服务器返回200 后,再讲请求包装成SSLSocket就可以发送请求了。
五、请求服务拦截器
CallServerInterceptor,利用发出请求到服务器并且解析生成
整个OkHttp功能的实现就在这五个默认的拦截器中,所以先理解拦截器模式的工作机制是先决条件。这五个拦截器分别为: 重试拦截器、桥接拦截器、缓存拦截器、连接拦截器、请求服务拦截器。每一个拦截器负责的工作不一样,就好像工厂流水线,最终经过这五道工序,就完成了最终的产品。
但是与流水线不同的是,OkHttp中的拦截器每次发起请求都会在交给下一个拦截器之前干一些事情,在获得了结果之后又干一些事情。整个过程在请求向是顺序的,而响应向则是逆序。
当用户发起一个请求后,会由任务分发起将请求包装并交给重试拦截器处理。
1、重试拦截器在交出(交给下一个拦截器)之前,负责判断用户是否取消了请求;在获得了结果之后,会根据响应码判断是否需要重定向,如果满足条件那么就会重启执行所有拦截器。
2、桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:Host)并添加一些默认的行为(如:GZIP压缩);在获得了结果后,调用保存cookie接口并解析GZIP数据。
3、缓存拦截器顾名思义,交出之前读取并判断是否使用缓存;获得结果后判断是否缓存。
4、连接拦截器在交出之前,负责找到或者新建一个连接,并获得对应的socket流;在获得结果后不进行额外的处理。
5、请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。
在经过了这一系列的流程后,就完成了一次HTTP请求!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/190285.html