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日志拦截器的时候,在拦截器中使用 ...
随机推荐
- node.js 安装配置笔记
先设置 NODEJS_MODULES 系统环境变量,我在这里设置为:D:\Program Files\nodejs\node_modules, 然后修改 npm.cmd 文件中 SET "N ...
- SSRF小梳理
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.(正 ...
- JPG文件结构分析
[转自网络 作者:一 江秋水] 一.简述 JPEG是一个压缩标准,又可分为标准 JPEG.渐进式JPEG及JPEG2000三种: ①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支 ...
- java_guide_类加载器
类加载器总结 JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader ...
- Django--Form组件使用出现的小bug记录--username拿到None
form过滤代码: class LoginForm(forms.Form): username = forms.CharField(max_length=20,min_length=3,label=' ...
- list第二部分
# lst = ['alex',[1,2,3], 'wusir','cgon', "女神", "太白"]# # l1= lst[0]# ## # print(l ...
- ubuntu18下Docker运行springboot项目
1.springboot项目打成jar包 mvn install 2.编写Dockerfile # 基础镜像使用java FROM java:8 # 作者 #MAINTAINER sk # VOLUM ...
- Ural 1248 Sequence Sum 题解
目录 Ural 1248 Sequence Sum 题解 题意 题解 程序 Ural 1248 Sequence Sum 题解 题意 给定\(n\)个用科学计数法表示的实数\((10^{-100}\s ...
- 基于docker的mongodb安装以及PHP使用
说明:用docker基于单服务器,虚拟多个服务器的方案, 以下是两个config服务器,两个分片,以及每个分片有一个副本的方案 这里关于给mongodb设置远程密码的问题,我采取了用两个compser ...
- dedecms发布文章时间显示多少分钟前
/**文章发布多少时间前*/function tranTime($time) { $rtime = date("m-d H:i",$time); $htime = date(&qu ...