IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> okhttp执行流程 -> 正文阅读

[网络协议]okhttp执行流程

?? ?1. newCall(Request)方法会返回一个RealCall对象,它是Call接口的实现。当调用 RealCall.execute() 的时候,RealCall.getResponseWithInterceptorChain()会被调用,它会发起网络请求并拿到返回的响应,装进一个Response对象并作为返回值返回;RealCall.enqueue()被调用的时候大同小异,区别在于enaueue()会使用Dispatcher的线程池来把请求放在后台线程进行,但实质上使用的同样也是 getResponseWithInterceptorChain()方法。?
?? ?2. getResponseWithInterceptorChain()方法做的事:把所有配置好的 Interceptor放在一个List里,然后作为参数,创建一个RealInterceptorChain对象,并调用chain.proceed(request)来发起请求和获取响应。
?? ?3. 在RealInterceptorChain中,多个 Interceptor会依次调用自己的intercept()方法。这个方法会做三件事:
?? ?当然了,最后一个Interceptor的任务只有一个:做真正的网络请求并拿到响应
?? ??? ?a. 1.对请求进行预处理
?? ??? ?b. 2、预处理之后,重新调用RealIntercepterChain.proceed()把请求交给下一个Interceptor
?? ??? ?c. 3、在下一个Interceptor处理完成并返回之后,拿到Response进行后续处理
?? ?4. 从上到下,每级Interceptor 做的事:
?? ??? ?a. o首先是开发者使用 addInterceptor(Interceptor) 所设置的,它们会按照开发者的要求,在所有其他Interceptor处理之前,进行最早的预处理工作,以及在收到Response之后,做最后的善后工作。如果你有统一的header要添加,可以在这里设置;
?? ??? ?b. o然后是RetryAndFollowUpInterceptor:它会对连接做一些初始化工作,并且负责在请求失败时的重试,以及重定向的自动后续请求。它的存在,可以让重试和重定向对于开发者是无感知的;
?? ??? ?c. BridgeInterceptor:它负责一些不影响开发者开发,但影响HTTP交互的一些额外预处理。例如,Content-Length的计算和添加、gzip的支持 (Accept-Encoding: gzip)、gzip压缩数据的解包,都是发生在这里;
?? ??? ?d. o CacheInterceptor:它负责Cache的处理。把它放在后面的网络交互相关Interceptor的前面的好处是,如果本地有了可用的Cache,一个请求可以在没有发生实质网络交互的情况下就返回缓存结果,而完全不需要开发者做出任何的额外工作,让Cache更加无感知;
?? ??? ?e. oConnectInterceptor:它负责建立连接。在这里,OkHttp会创建出网络请求所需要的TCP连接(如果是HTTP),或者是建立在TCP连接之上的TLS连接(如果是HTTPS),并且会创建出对应的HttpCodec对象(用于编码解码HTTP请求);
?? ??? ?f. 然后是开发者使用addNetworkInterceptor(Interceptor)所设置的,它们的行为逻辑和使用addInterceptor(Interceptor)创建的一样,但由于位置不同,所以这里创建的Interceptor会看到每个请求和响应的数据(包括重定向以及重试的一些中间请求和响应),并且看到的是完整原始数据,而不是没有加Content-Length的请求数据,或者Body还没有被gzip解压的响应数据。多数情况,这个方法不需要被使用,不过如果你要做网络调试,可以用它;
?? ??? ?g. o CallServerInterceptor:它负责实质的请求与响应的I/0操作,即往Socket里写入请求数据,和从Socket里读取响应数据。


?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 16:11:28  更:2021-11-15 16:13:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:36:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码