okhttp

使用 OkHttp 基本是以下四步:

  1. 创建 OkHttpClient 对象
  2. 创建Request请求对象
  3. 创建Call对象
  4. 同步请求调用call.execute();异步请求调用call.enqueue(callback)

OkHttp最主要的两个部分:

(1)分发器

(2)拦截器

因为我们的okhttp支持并发的请求,不是一次只帮你处理一个网络请求,它是支持并发的。

那么分发器它是帮助我们将我们提交给okhttp的各种请求去进行一个任务的分配。

那么提到并发,就想到了并发编程相关的知识点,想到了多线程,想到了线程池,

那么分发器它里面就配置了一个线程池。

我们的异步请求任务,都会在这个线程池里面去提交一个任务,除了分发器之外呢,还有就是我们的拦截器。

okhttp里面有五大默认的拦截器,采用责任链的设计模式。

除了五大默认的拦截器之外呢,我们也可以自己去加入我们自己的普通拦截器以及NetworkInterceptor,

这些拦截器符合了单一责任原则,每个拦截器只负责一项工作,负责自己的一项工作。

五大默认拦截器:

(1)RetryAndFollowUpInterceptor 重试和重定向拦截器

分发器分发任务后,我们提交给okhttp是一个Request,那么重试和重定向拦截器它会第一个接收到我们请求

的Request对象,然后分发重试与重定向拦截器它并不会对我们的Request进行太多的处理,它基本就是它直接把

我们的Request让下一个拦截器处理,它只要是对返回的Response做了一些处理,比如说我们的Response,

我们查看到服务器给我们的响应码是300、301、302这些需要重定向的,那么我们这个拦截器,它会自动的

帮我们去找到我们响应头当中有一个Location,Location后面跟的是一个新的链接,意味着我们需要跟这个新的链接去发请求.

(2)BridgeInterceptor 桥接拦截器

下一个拦截器就是桥接拦截器,桥接拦截器会帮我们往这个请求的请求头当中加入一些参数,如果熟悉HTTP请求的同学,

你可能会有了解我们的每一个HTTP请求,这里针对的是HTTP1.1,你都要在请求头当中加上一个Host请求,

Host请求头的value对应了你要请求的那一个请求的哪一个接口的域名,我们会发现我们在实际使用HTTP的时候,

我们并不会手动的给我们每一个请求去加上这一个Host,所以这个Host又是HTTP里面一定要加的,那怎么办呢?

这个Bridge它帮我们加了这个东西,除了这个Host请求头之外,还有像一些cache-Control缓存控制、一些gzip压缩,

包括cookie的设置都是在这个Bridge拦截器里面自动帮我们进行的。

(3)CacheInterceptor 缓存拦截器

下一个拦截器是缓存拦截器,缓存连接器里面它就会去判断我们是否有本地缓存,如果说对应的这个一个请求,

有本地缓存的话,就不会去请求服务器了,它直接从缓存当中把数据解析出来,然后响应给我们的请求值,响应给我们的用户。

所以这个缓存规则的话,其实是非常复杂的,它跟我们的请求头有关,跟我们的响应头也有关,

跟我们使用者它自己配置的使用okhttp缓存接口的配置,它都会影响我们的缓存的一个判定,所以还是要怎样所以还是要去了解HTTP协议的规则。

(4)ConnectInterceptor 连接拦截器

如果不允许使用缓存,就会把请求交给下一个拦截器,下一个拦截器就是ConnectInterceptor 连接拦截器,

它的作用就是帮我们获取到一个有效的健康的连接TCP连接,因为HTTP协议是基于TCP协议的,我们怎么来建立TCP连接呢,

Socket,在建立Socket连接的时候,因为这个Socket我们都知道是全双工的,它是一个长连接的,而我们的HTTP其实有可能,

你会发起一次请求之后就断开了,这个取决于我们使用的HTTP的版本,以及请求和响应头的一些控住,那个

keep-Alive请求头和响应头的一个控制,我们如果说达到了条件的情况下,一个Socket跟某一台服务器建立连接,

我们下一次再要来请求,这台服务器的其他接口,包括同样的接口的话,其实可以复用这个Socket,

所以在Connect拦截器里面呢,它要帮我们去找到这样的一个可以复用的socket,如果说没有找到可以复用的socket,

它就帮我们去建立Socket,OKhttp里面有很多的其他细节,比如路由机制,还可以配置代理,代理又分为Socket代理和HTTP代理,

HTTP代理又分为普通代理和隧道代理,所以这些东西都是网络基础的东西。拿到这个Socket就可以完成跟服务器的交互了。

(5)CallServerInterceptor 请求服务拦截器

下一个拦截器是请求服务拦截器,它拿到了经过一系列处理的Reques和一个Socket,那么它就可以去利用Socket的OutputStream

输出流,把我们的Request再按照它里面的配置的各种参数,组装成HTTP的报文,HTTP的报文在2.0以下的时候,其实就是一些

字符串,2.0以上就是一些二进制的格式,那我们就主要是基于这个它其实就是去进行字符串的拼接,把我们的Requst包含的各种信息

拼接成HTTP报文,然后用Socket发出去。就完成了我们整个的请求。然后通过Socket的InputStream得到服务器的响应。服务器响应我

们的呢,也是一段字符串,HTTP的报文字符串,然后按照HTTP的规则,去对这一段报文进行解析,解析到了之后,是在CallServerInterceptor

里面拿到了这个Response,然后再一层层的往上面去返回,返回到上一层的连接拦截器,再返回到缓存拦截器,直达第一个拦截器,

一层层的处理,我们也可以加入自己的拦截器,有2个接口,一个是addIntercept,一个是addNetworkIntercept,addIntercept拦截器

会在RetryAndFollowUpInterceptor前面,也就是会在我们的拦截器的最前面,而addNetworkIntercept呢,因为okhttp不仅仅只是支持

HTTP协议的,还支持WebSocket,如果我们是使用WebSocket的话,那么NetworkIntercept它没有意义,如果我们使用okHttp协议,

我们进行的是HTTP请求,那么我们配置的NetworkInterceptor它是有意义的,而NetworkInterceptor它是加在了我们CallServer的上一层,

这是OKHTTP的拦截器。

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值