okhttp——RetryAndFollowUpInterceptor
简介
okhttp的网络请求采用interceptors链的模式。每一级interceptor只处理自己的工作,然后将剩余的工作,交给下一级interceptor。本文将主要阅读 okhttp 中的 RetryAndFollowUpInterceptor ,了解它的作用和工作原理。
RetryAndFollowUpInterceptor
顾名思义, RetryAndFollowUpInterceptor 负责okhttp的请求失败的恢复和重定向。
核心的
intercept
方法分两段阅读:
前半段的逻辑中, RetryAndFollowUpInterceptor 做了几件事:
- 通过 Transmitter 准备连接
- 执行请求链下一级
- 处理了下一级请求链中的 RouteException 和 IOException 。
Transmitter 的实现,以后的章节再单独讲解。此处略过。我们重点看一下, RetryAndFollowUpInterceptor 如何处理两个异常。
RouteException
从注释中,我们可以看到,RouteException表示客户端连接路由失败。此时会调用
recover
方法,如果recover方法再失败,会抛出RouteException中的
FirstConnectException
。
我们看一下
recover
方法的实现:
首先我们调用应用层的失败回调,如果应用层返回false,就不再进行重试。
然后,我们判断请求的返回,如果请求已经开始或请求限定,只能请求一次,我们也不再进行重试。其中,只能请求一次,可能是客户端自行设定的,也可能是请求返回了 404 。明确告知了文件不存在,也不会再重复请求。
接下来,是okhttp认为的致命错误,不会再重复请求的,都会在
isRecoverable
方法中。致命错误包括:协议错误、SSL校验错误等。
最后,在底层中寻找是否还有其他的 Router 可以尝试。
IOException
IOException表示连接已经建立,但读取内容时失败了。我们同样会进行
recover
尝试,由于代码逻辑一样,不再重复阅读。
在finally中, Transmitter 会释放所有资源。
followUpRequest
接下来,我们看一下
RetryAndFollowUpInterceptor
中
intercept
后半段的实现:
我们拆开来看这段复杂的逻辑。大体上来说,这段逻辑主要是通过上次请求的返回,生成
followUp
。然后根据
followUp
的内容,判断是不是有效的返回。如果返回是有效的,就直接return请求的返回。如果返回无效,则
request=followUp
,重走while循环,重新请求。
所以这一段的核心逻辑在于
followUpRequest
方法。我们来看下
followUpRequest
的实现。