1、OkHttp 是什么?优势有哪些?
答案
OkHttp 是 Square 开源的高性能 HTTP/HTTPS 网络请求框架,替代原生 HttpURLConnection。核心优势:
- 支持 HTTP/2、SPDY、WebSocket;
- 连接池复用 Socket,减少三次握手,提升速度;
- 内置缓存机制(强缓存、协商缓存);
- 责任链拦截器统一处理请求 / 响应;
- 支持同步、异步请求;
- 支持失败重试、重定向;
- 四种超时精细配置、弱网适配;
- 支持 Gzip 压缩、Cookie 持久化。
2、OkHttp 核心四大组件
答案
- OkHttpClient :网络请求总入口,全局配置、连接池、拦截器、超时;全局单例。
- Request:封装请求参数(Url、请求方式、Header、Body、缓存策略)。
- Call:代表一次完整网络请求任务,只能执行一次。
- Response:服务器返回的响应数据。
3、同步 execute () 和异步 enqueue () 区别
答案
- 同步 execute ()当前线程阻塞 等待结果;不能在主线程调用,会 ANR。
- 异步 enqueue ()内部丢到 OkHttp 自己的线程池执行;成功 / 失败回调在子线程,更新 UI 必须切主线程。
4、OkHttp 有几个拦截器?分别作用?执行顺序?
答案 一共5 层拦截器,责任链模式:
- 自定义应用拦截器统一加 Header、日志、Token、签名、统一参数。
- BridgeInterceptor 桥接拦截器补全默认请求头、管理 Cookie、Gzip 压缩、请求体编码。
- CacheInterceptor 缓存拦截器 按照 HTTP 协议处理强缓存、协商缓存,命中缓存直接返回,不走网络。
- ConnectInterceptor 连接拦截器 负责从连接池获取复用 Socket,建立 TCP 连接。
- CallServerInterceptor 网络拦截器真正和服务器建立通信,发送请求、读取响应数据。
执行顺序:
请求:从上 → 下
响应:从下 → 上
5、拦截器顺序是固定的吗?
答案
系统内置 4 个拦截器顺序固定;
自定义拦截器可以选择位置:
- addInterceptor () 加在最前面(应用拦截器)
- addNetworkInterceptor () 加在缓存之后、网络请求之前
6、OkHttp 连接池原理
答案
- 相同域名的请求复用同一个 Socket 连接;
- 不用每次请求都重新 TCP 三次握手、TLS 四次握手;
- 默认空闲连接保留 5 分钟,超时自动回收;
- 减少延迟、减少资源消耗、提升网络并发效率。
7、为什么 OkHttpClient 要全局单例?
答案
- OkHttpClient 内部维护连接池、线程池、缓存、拦截器;
- 每次 new 都会新建独立连接池和线程池,无法复用连接,请求变慢、浪费内存;
- 单例保证全局共享连接池、线程池,最大化复用网络连接。
8、Call 可以重复执行吗?
答案
不可以。
一个 Call 只能执行一次 execute /enqueue,重复调用直接抛异常。
需要重复请求:用 call.clone() 克隆新 Call。
9、OkHttp 缓存机制原理
答案遵循 HTTP 标准缓存:
- 强缓存 依赖
Cache-Control、Expires;没过期直接读本地缓存 ,不发任何网络请求。 - 协商缓存 依赖
ETag/If-None-Match、Last-Modified/If-Modified-Since;发请求和服务器校验,资源没更新返回 304,继续用本地缓存;更新了返回新数据。
10、OkHttp 四种超时分别是什么?
答案
- 连接超时:建立 TCP 握手超时。
- 读取超时:读取服务器响应数据超时。
- 写入超时:向服务器提交数据超时。
- 调用超时:整个请求全过程最大超时(包含重试、重定向)。
11、怎么用拦截器实现 Token 过期自动刷新?
答案
- 自定义拦截器拦截响应;
- 判断返回码 401/403 代表 Token 失效;
- 同步请求刷新 Token 接口,获取新 Token;
- 重新构造新 Request 带上新 Token;
- 重新发起原请求,对业务层无感知。
12、OkHttp 拦截器和网络拦截器区别
答案
1.应用拦截器 addInterceptor
最先执行,在缓存之前;
能拦截缓存命中的请求;
适合统一 Header、日志。
2.网络拦截器 addNetworkInterceptor
在缓存之后、真正网络请求之前;
缓存命中不走这里;适合处理网络层面、请求重试。
13、OkHttp 怎么处理 HTTPS 证书?
答案
- 默认信任正规 CA 证书;
- 开发环境可忽略证书校验(自定义 SSLSocketFactory 绕过校验);
- 生产环境做证书固定(SSL Pinning),防止中间人抓包、劫持。
14、OkHttp 线程池原理
答案
OkHttp 内部自带异步请求线程池;
自动控制最大并发数,不用开发者手动开子线程;
统一调度网络任务,避免并发过多造成网络阻塞、OOM。
15、OkHttp 重定向和重试机制
答案
默认自动支持 301/302 重定向;
网络失败、链路异常自动重试有限次数;
可手动关闭重定向、自定义重试策略。
16、OkHttp 和 Retrofit 关系
答案
- OkHttp:底层负责真实 Socket 网络通信、连接池、缓存、拦截器;
- Retrofit :基于 OkHttp 封装的注解式上层框架 ,简化接口定义、自动 Json 解析、适配协程;Retrofit 只是封装壳,底层网络完全依赖 OkHttp。
17、OkHttp WebSocket 原理
答案
原生支持 WebSocket 长连接;
通过 newWebSocket() 建立全双工通信;
适合即时聊天、实时推送、设备长连接;
底层基于 HTTP/2 升级协议,保持长连接不断开。
18、OkHttp 责任链模式怎么理解?
答案
所有拦截器形成一条链表;
每个拦截器只处理自己关心的逻辑,然后交给下一个拦截器;
请求自上而下传递,响应自下而上回调;
解耦每一层职责,方便扩展、添加自定义逻辑。
面试一句话总结(背这句就能稳住)
OkHttp 是高性能网络框架,内置 5 层责任链拦截器、连接池复用 Socket、标准 HTTP 缓存、四种超时控制;必须全局单例,支持同步异步、HTTP2 和 WebSocket;通过拦截器统一处理日志、Header、Token 刷新;Retrofit 底层依赖 OkHttp,采用责任链模式分层处理请求与响应。