按照执行的顺序,先看retryAndFollowUpInterceptor
具体的流程在图中已经标明,那么streamAllocation是什么作用呢
从成员变量看,这是个管理网络连接的类,具体的我们可以在ConnectInterceptor中再分析
接下来看bridgeInterceptor
没啥好解释的,添加默认字段然后去执行proceed方法而已
下一个!CacheInterptor
先看下这两个成员变量的意义
再理解下面这段具体的代码就容易了
下面即走到本地缓存为空的情况
引申:为啥不允许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
看class的注释,可以知道 ,这个类是用来开启服务器连接,其他并没有做什么操作,那么看看前面欠下的“债”,看看到底是怎么做连接的?
看来重点就是findHealthyConnection和newCodec这两个方法了,先看findHealthyConnection
接下来,除了我们自定义的networkInterceptors之外,就只有最后一个CallServerInterceptor了
看名字。。。怎么好像这个才是真正进行连接服务器的interceptor。。。实际上,上一个是用来连接服务器,而这个,就是用来真正和服务器进行通讯了!
终于到last one了。。
这里可以看到,GET或者HEAD请求方法是不需要写入100-continue的,因为这类请求不需要使用请求体的
引申:http2和http1区别?
答:一张图,因为可以并行请求,所以速度更快
继续往下看:
来看一下http2的openResponseBody做了啥
就是将流里面的内容写入responseBody!然后将整个response返回给我们就行了