okhttp-学习okhttp拦截器链,并模拟写一个校验链

本文介绍了OkHttp的拦截器链工作原理,通过责任链模式实现请求响应的校验和定制。文章详细分析了RealCall类的execute方法,展示了拦截器如何按序执行。同时,作者分享了如何扩展OkHttp,自定义校验链来满足特定的业务需求,如参数校验和登录验证,并给出了相关代码示例。
摘要由CSDN通过智能技术生成

拦截器简介

  1. okhttp通过拦截器链实现对请求响应的校验及封装,满足定制化需求
  2. okhttp拦截器链使用了责任链模式,每个拦截器可以选择将请求处理,或者将请求传给下个拦截器
  3. okhttp常见的拦截器有:BridgeInterceptor、CacheInterceptor、ConnectInterceptor、CallServerInterceptor

okhttp拦截器

实现原理

  1. 顺序将拦截器加入到一个集合,创建一个拦截器链,将拦截器集合作为参数传入调用拦截器proceed方法
  2. proceed方法内部通过index控制每个拦截器按序调用,内部调用拦截器的intercept方法
  3. 执行完一个拦截器后,再创建一个新的拦截器链,继续调用其proceed方法
  4. 当index的size大于拦截器集合大小了,说明拦截器调用结束

源码分析

  1. 入口类:RealCall,执行方法:execute,同步/异步调用中都会执行拦截器链
RealCall调用
  1. 同步请求方法调用:
public Response execute() throws IOException {
  synchronized (this) {
    if (executed) throw new IllegalStateException("Already Executed");
    executed = true;
  }
  captureCallStackTrace();
  try {
    client.dispatcher().executed(this);
    // 执行拦截器链得到resonse结果
    Response result = getResponseWithInterceptorChain();
    if (result == null) throw new IOException("Canceled");
    return result;
  } finally {
    client.dispatcher().finished(this);
  }
}
  1. 异步请求方法调用
protected void execute() {
    boolean signalledCallback = false;
    try {
      // 执行拦截器链,得到response结果
      Response response = getResponseWithInterceptorChain();
      if (retryAndFollowUpInterceptor.isCanceled()) {
        signalledCallback = true;
        responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
      } else {
        signalledCallback = true;
        responseCallback.onRespons
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值