继上一篇Okhttp源码解析的博客已经过去一年多了,当时没有继续写下去的原因是因为本皇的小公主出生了!(借口,其实就是因为分析下去发现内容太多,画不动图了)做为一个小区No.1的好爸爸(邻居册封的,我姑娘小区No.1漂亮,这点随我)当然就没时间写了。
那为什么又写了呢,原因是我现在在公司主攻网络框架…正好有时间写一波。
书接上文,现在我们来看一下OkHttpClient源码中的第一个拦截器:
RetryAndFollowUpInterceptor
这个拦截叫:重试 and 重定向拦截器,顾名思义就是干名字上的这些事的,那么它是怎么实现的呢?
这里注意我标红的部分稍后我来解析下这两个的含义
followUpRequest()
中通过这些http状态码
来确认是否需要重定向
HTTP_PROXY_AUTH 407 代理身份验证
HTTP_UNAUTHORIZED 401 未授权
HTTP_PERM_REDIRECT 308 重定向
HTTP_TEMP_REDIRECT 307 重定向
HTTP_MULT_CHOICE 300 Multiple Choices
HTTP_MOVED_PERM 301 Moved Permanently
HTTP_MOVED_TEMP 302 Temporary Redirect
HTTP_SEE_OTHER 303 See Other
HTTP_CLIENT_TIMEOUT 408 Request Time-Out
HTTP_UNAVAILABLE 503 Service Unavailable
总结:
- 创建
StreamAllocation
对象,这个对象实际上是根据域名和端口,从okhttp提供的链接池中查找可复用的链接(socket
),这里先简单说一下,这是okhttp的关于网络请求的一个优化。HTTP
协议是基于TCP
协议的,每次建立链接都需要三次握手
,关闭链接需要四次挥手
。那么三次握手
建立链接后我们保持这个链接一段时间
,而不是请求结束就关闭链接,这样如果有相同域名和端口
的http请求,就可以复用这个链接从而节省下三次握手
建立链接的的时间。这部分内容会在后续文章中进行讲解 - 开启循环,层层调用,获取Response,如果获取过程出现异常,尝试重试,如果正常获取到,看看是否需要重定向,最大重定向次数20次,具体看代码注释相信都可以理解。