简介
Okhttp的封装了一些列请求所需要的参数,不管是同步请求还是异步请求最终都会经过五大拦截器的处理才能得到服务器返回的请求结果。本篇文章主要讲解Okhttp五大拦截器的重试重定向拦截器的作用。
RetryAndFollowUpInterceptor拦截器作为OKhttp的第一个默认拦截器,主要作用是当客户端网络请求失败时或目标响应的位置发生改变时调用。
一,网络失败重试
val realChain = chain as RealInterceptorChain //请求链
var request = chain.request //网络请求
val call = realChain.call //call对象
var followUpCount = 0 //重试次数初始为0
var priorResponse: Response? = null //以前的返回值
var newExchangeFinder = true
var recoveredFailures = listOf<IOException>()
//默认进入while死循环
while (true) {
//获取在链接池中网络链接
call.enterNetworkInterceptorExchange(request, newExchangeFinder)
try {
//获取网络请求返回结果
response = realChain.proceed(request)
newExchangeFinder = true
} catch (e: RouteException) { //路线异常
// The attempt to connect via a route failed. The request will not have been sent.
//检查是否需要重试
if (!recover(e.lastConnectException, call, request, requestSendStarted = false)) {
throw e.firstConnectException.withSuppressed(recoveredFailures)
} else {
recoveredFailures += e.firstConnectException
}
newExchangeFinder = false
continue
} catch (e: IOException) { //IO异常
// An attempt to communicate with a server failed. The request may have been sent.
//如果是因为IO异常,那么requestSendStarted=true
if (!recover(e, call, request, requestSendStarted = e !is ConnectionShutdownException)) {
throw e.withSuppressed(recoveredFailures)
} else {
recoveredFailures += e
}
newExchangeFinder = false
continue
}
request = followUp
priorResponse = response
} finally {
call.exitNetworkInterceptorExchange(closeActiveExchange)
}
}
}