按照执行的顺序,先看retryAndFollowUpInterceptor

okhttp源码大解析(二)

okhttp源码大解析(二)

具体的流程在图中已经标明,那么streamAllocation是什么作用呢

okhttp源码大解析(二)

从成员变量看,这是个管理网络连接的类,具体的我们可以在ConnectInterceptor中再分析

 

接下来看bridgeInterceptor

okhttp源码大解析(二)

没啥好解释的,添加默认字段然后去执行proceed方法而已

okhttp源码大解析(二)

下一个!CacheInterptor

先看下这两个成员变量的意义

okhttp源码大解析(二)

再理解下面这段具体的代码就容易了

okhttp源码大解析(二)

okhttp源码大解析(二)

下面即走到本地缓存为空的情况

okhttp源码大解析(二)

okhttp源码大解析(二)

引申:为啥不允许post本地缓存呢?

答:GET后退/刷新无害,POST会导致重新提交数据。

GET书签可以被收藏,POST不可以。

GET编码application/x-www-form-url,POST为encodedapplication/x-www-form-urlencoded或multipart/form-data

GET历史参数保留在浏览器历史,POST不会

GET对数据长度有限制(url限制2048个字符),POST没有

GET只允许ASCII,POST没有

 

下一个!ConnectInterceptor

okhttp源码大解析(二)

看class的注释,可以知道 ,这个类是用来开启服务器连接,其他并没有做什么操作,那么看看前面欠下的“债”,看看到底是怎么做连接的?

okhttp源码大解析(二)

看来重点就是findHealthyConnection和newCodec这两个方法了,先看findHealthyConnection

okhttp源码大解析(二)

okhttp源码大解析(二)

okhttp源码大解析(二)

okhttp源码大解析(二)

okhttp源码大解析(二)

接下来,除了我们自定义的networkInterceptors之外,就只有最后一个CallServerInterceptor了

看名字。。。怎么好像这个才是真正进行连接服务器的interceptor。。。实际上,上一个是用来连接服务器,而这个,就是用来真正和服务器进行通讯了!

okhttp源码大解析(二)

终于到last one了。。

okhttp源码大解析(二)

okhttp源码大解析(二)

这里可以看到,GET或者HEAD请求方法是不需要写入100-continue的,因为这类请求不需要使用请求体的

okhttp源码大解析(二)

引申:http2和http1区别?

答:一张图,因为可以并行请求,所以速度更快

okhttp源码大解析(二)

继续往下看:

okhttp源码大解析(二)

来看一下http2的openResponseBody做了啥

okhttp源码大解析(二)

就是将流里面的内容写入responseBody!然后将整个response返回给我们就行了

 

 

相关文章:

  • 2021-03-28
  • 2021-06-21
  • 2021-06-22
  • 2021-06-29
  • 2022-02-10
  • 2021-11-15
  • 2022-01-07
猜你喜欢
  • 2021-10-15
  • 2022-01-07
  • 2022-01-07
  • 2022-01-04
相关资源
相似解决方案