okhttp初识拦截器
拦截器流程:
简单回顾同步 / 异步:
同步请求就是执行请求的操作是阻塞式,直到HTTP响应返回。
异步请求就类似于非阻塞式的请求,它的执行结果一般都是通过接口回调的方式告知调用者。
okHttp拦截器:
来自官网的解释:拦截器是OkHttp中提供一种强大的机制,它可以实现网络监听、请求以及响应重写、请求失败重试等功能。
下面来看一下官网的一张介绍拦截器的图:

其中Okhttp包含Application Interceptors【应用拦截器】、系统拦截器、Network Interceptors【网络拦截器】,其中咱们接下来要分析的就是从系统自带的拦截器开始,那系统拦截器都有哪些呢,如下图:

关于这些系统拦截器在接下来会一一进行详细分析的,目前先有个大致的印象。
拦截器链介绍:
有了上面的理论了解之后,下面则从源码的角度来对拦截器进行一个进一步了解,这里以同步请求为例,因为异步请求关于拦截器这块基本上一样:


进一步定位:



那接下来将注意力集中在RealInterceptorChain.proceed()方法中:

然后此时在这个方法中有个核心代码:

这样就将若干个拦截器以链式的方式进行执行,这也是拦截器链的主要作用。下面总结一下拦截器:
1、创建一系列的拦截器,并将其放入到一个拦截器list中。
2、创建一个拦截器链RealInterceptorChain,并执行拦截器链的proceed方法。
那目前对于拦截器怎么链起来的有了一个大局观,那到底每个拦截器是怎么来衔接的呢?这里以一个具体的拦载器为例初步进行分析:RetryAndFollowUpInterceptor:

所以将目光集中在这个方法之上,代码比较多,这里先只看核心的:

而如之前所分析,我们知道RealInterceptorChain在proceed()方法中又会去获取下一个拦截器继续往下链,如下:

如此循环,就会将所有的拦截器依顺序一个个去执行完成,这也就是拦截器的一个核心实现逻辑。所以下面对拦截器的具体逻辑再总结一下:
1、在发起请求前对request进行处理。
2、调用下一个拦截器,获取response。
3、对response进行处理,返回给上一个拦截器。
okhttp初识拦截器的更多相关文章
- 如何实现 Https拦截进行 非常规“抓包” 珍惜Any 看雪学院 今天 前段时间在自己做开发的时候发现一个很好用的工具,OKHttp的拦截器(何为拦截器?就是在每次发送网络请求的时候都会走的一个回调)大概效果如下:
如何实现 Https拦截进行 非常规“抓包” 珍惜Any 看雪学院 今天 前段时间在自己做开发的时候发现一个很好用的工具,OKHttp的拦截器(何为拦截器?就是在每次发送网络请求的时候都会走的一个回调 ...
- Android OKHttp 可能你从来没用过的拦截器 【实用推荐】
前言 在平时开发中,你有没有下面这样的困扰呢? 场景一 明明是服务端的接口数据错误,而QA(测试)第一个找到的可能是客户端开发的你,为什么这个页面出现错误了? 而作为客户端开发的你,可能要拿出测试机连 ...
- Android 开发 框架系列 OkHttp拦截器
前言 此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解 添加Interceptor的简单例子 ...
- flume【源码分析】分析Flume的拦截器
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- Struts2基础学习(五)—拦截器
一.概述 1.初识拦截器 Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...
- Okhttp 插入缓存拦截器 解析
我们在做网络请求的时候,如果网络请求过于频繁而且请求的数据变动不大,或者基本没有变动,这个时候如果没有缓存功能,我们想一下 会浪费掉多少资源,一次请求刷新一次,去请求一次,不但会消耗用户的流量,而且还 ...
- OkHttp拦截器的实现原理
今天项目中遇到需要将从push接收到的数据按照协议parse成应用层需要的结构化数据类型问题:因为push消息类型繁多,等待解析出的结构化数据类型也多样,有的还需要经过几步的parse过程:而且因为项 ...
- OkHttp 3.x 源码解析之Interceptor 拦截器
拦截器 Java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提 ...
- Okhttp拦截器统一异常处理并多次读取response.body().string()
参考:https://blog.csdn.net/a624806998/article/details/73863606 引言: 写这篇文章,因为在自己编写实现Http日志拦截器的时候,在拦截器中使用 ...
随机推荐
- [Paper Reading] Show and Tell: A Neural Image Caption Generator
论文链接:https://arxiv.org/pdf/1411.4555.pdf 代码链接:https://github.com/karpathy/neuraltalk & https://g ...
- 计算1-9总共九个数字可以满足abc+def=hij这样的式子
计算1-9总共九个数字可以满足abc+def=hij这样的式子:其中abcdefghij九个数字各个都不相同,它们都属于1-9个数字中: 首先,第一种方法很简单很暴力,直接枚举,这样的话时间复杂度高: ...
- linux用户管理添加用户的默认配置文件useradd详解
/etc/default/useradd 文件 cat /etc/default/useradd 常用命令: useradd 添加用户 userdel 删除用户 passwd 改密码 use ...
- js函数(3)
8.5 作为命名空间的函数 即定义一个函数用做临时的命名空间,在这个命名空间内定义的变量都不会污染到全局命名空间. 将一段代码封装在函数内部,然后调用这个函数.这样全局变量就变成了函数内部的局部变量: ...
- 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针
1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...
- Vue代码分割懒加载的实现方法
什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多 ...
- Guava 工具类之joiner的使用
joiner主要用于对字符串的连接,也可用于对map中key value的连接 public class JoinerTest { private static final List<Strin ...
- servlet获取checkbox的值出现选中的值为on。问题所在。。。
<form action="/Http/request06" method="post"> 用户名:<input type="tex ...
- Codeforces contest 1277 E. Beautiful Rectangle
- Sumitomo Mitsui Trust Bank Programming Contest 2019 Task F. Interval Running
Link. There is a nice approach to this problem that involves some physical insight. In the following ...