深入解读OKhttp五大拦截器之RetryAndFollowUpInterceptor

本文详细解析了Okhttp中的RetryAndFollowUpInterceptor拦截器,包括网络请求失败时的重试策略以及响应重定向的处理过程,展示了如何根据特定异常和配置决定是否继续尝试或终止请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

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)
      }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值