Okhttp原理总结

一、核心概述:OkHttp是什么?

OkHttp是一个高效、支持现代HTTP协议(如HTTP/2)的网络请求客户端 。其设计目标是减少延迟、节省带宽,并提升网络请求的可靠性

主要包括几大部分:

  • OkHttpClient :如同公司的总调度中心,负责全局配置和协调。

  • Dispatcher :如同任务调度员,管理着所有请求任务的排队与执行。

  • 拦截器链 :如同一条自动化流水线,请求和响应会依次经过各个加工站,每个站点(拦截器)负责一项特定工作。

  • 连接池 :如同共享汽车服务,让前往同一目的地的请求可以复用连接,避免每次都重新建立。

二、核心工作机制:一次请求的完整旅程

  1. 请求构建与封装

    通过建造者模式创建 Request对象,定义URL、方法、头部等信息。OkHttpClient的 newCall(request)方法会将 Request封装成一个 RealCall对象,它代表一个已准备好、可执行的请求

  2. 任务调度:同步 vs 异步

    • 同步请求 :调用 call.execute()。Dispatcher会将其记录到同步队列 中,然后直接在当前线程执行 ,并阻塞直到返回 Response

    • 异步请求 :调用 call.enqueue(callback)。Dispatcher会根据规则决定其去向:

      • 如果当前正在运行的异步请求数小于64 ,且对同一主机的请求数小于5 ,则放入运行队列并交给线程池执行

      • 若不满足条件,则先放入准备队列 等待。每当有请求完成,Dispatcher就会检查并尝试将等待的请求 promotion 到运行队列

  3. 核心处理:拦截器责任链

    无论是同步还是异步请求,最终都会通过 getResponseWithInterceptorChain()方法进入拦截器责任链模式。这是OkHttp最精巧的设计。请求会像接力棒一样依次经过一系列拦截器,每个拦截器各司其职
    其核心流程如下:

复制代码

下面是每个拦截器的具体职责

  • RetryAndFollowUpInterceptor:负责请求失败时的重试和处理服务器返回的重定向指令。

  • BridgeInterceptor :为用户请求补充必要的HTTP头(如Host, Accept-Encoding),并将服务器返回的GZIP压缩响应体透明解压。

  • CacheInterceptor:根据HTTP缓存规则,如果存在可用缓存则直接返回,避免网络请求。

  • ConnectInterceptor :负责与目标服务器建立TCP连接(可能涉及TCP握手、TLS握手),核心是从连接池中复用已有连接或创建新连接。

  • CallServerInterceptor:这是链的终点,负责真正向服务器写入请求数据,并从连接中读取响应数据。

三、关键机制

  • 连接复用与连接池

    它内部维护一个 ConnectionPool(连接池)。当需要建立新连接时,会先检查池中是否有同主机(相同协议、主机名、端口)且空闲的连接可供复用,从而避免重复进行TCP和TLS握手带来的开销。连接池会通过一个清理线程定期清除闲置过久的连接(默认最多保持5个空闲连接,持续5分钟)。

  • 使用的设计模式

    • 责任链模式:拦截器链是此模式的经典应用,将复杂流程分解,每个环节职责单一,易于扩展

    • 建造者模式 :用于构建 OkHttpClient和 Request对象,使得配置众多可选参数时代码更清晰

    • 门面模式 :OkHttpClient本身充当了门面,为用户提供了一个简单的接口,背后却封装了调度器、连接池等复杂子系统

  • 是否可以使用自定义拦截器

可以添加自定义拦截器

相关推荐
没差c4 天前
RetrofitClient写接口、导包、配置、路径
java·spring boot·okhttp
事圆则缓15 天前
OkHttp + Retrofit 协作原理
okhttp·retrofit
降临-max17 天前
接口自动化(TestNG+OKHttp)
软件测试·okhttp·自动化·testng
吴声子夜歌18 天前
Java扩展——OkHttp
java·开发语言·okhttp
额鹅恶饿呃18 天前
Asynchronous JavaScript And XML(异步的JS和XML )
okhttp
泡海椒18 天前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
泡海椒19 天前
JQuick-Curl 二次开发:自定义解析器、扩展点开发指南,如何把框架能力真正变成团队资产
java·开发语言·okhttp·maven
摇滚侠20 天前
《SpringBoot 3:入门与应用实战》第 9 章 跨域问题 阅读笔记 27
spring boot·笔记·okhttp
刘广睿22 天前
断点续传与分片下载是怎么实现的?Range 请求在视频下载中的工程实践
okhttp·ffmpeg·音视频·下载·python3.11
泡海椒1 个月前
JQuick-Curl vs RestTemplate / OkHttp / OpenFeign:框架选型对比,谁更适合第三方接口调用?
okhttp