OkHttp

1、OkHttp 是什么?优势有哪些?

答案

OkHttp 是 Square 开源的高性能 HTTP/HTTPS 网络请求框架,替代原生 HttpURLConnection。核心优势:

  1. 支持 HTTP/2、SPDY、WebSocket
  2. 连接池复用 Socket,减少三次握手,提升速度;
  3. 内置缓存机制(强缓存、协商缓存);
  4. 责任链拦截器统一处理请求 / 响应;
  5. 支持同步、异步请求;
  6. 支持失败重试、重定向
  7. 四种超时精细配置、弱网适配;
  8. 支持 Gzip 压缩、Cookie 持久化。

2、OkHttp 核心四大组件

答案

  1. OkHttpClient :网络请求总入口,全局配置、连接池、拦截器、超时;全局单例
  2. Request:封装请求参数(Url、请求方式、Header、Body、缓存策略)。
  3. Call:代表一次完整网络请求任务,只能执行一次。
  4. Response:服务器返回的响应数据。

3、同步 execute () 和异步 enqueue () 区别

答案

  • 同步 execute ()当前线程阻塞 等待结果;不能在主线程调用,会 ANR。
  • 异步 enqueue ()内部丢到 OkHttp 自己的线程池执行;成功 / 失败回调在子线程,更新 UI 必须切主线程。

4、OkHttp 有几个拦截器?分别作用?执行顺序?

答案 一共5 层拦截器,责任链模式:

  1. 自定义应用拦截器统一加 Header、日志、Token、签名、统一参数。
  2. BridgeInterceptor 桥接拦截器补全默认请求头、管理 Cookie、Gzip 压缩、请求体编码。
  3. CacheInterceptor 缓存拦截器 按照 HTTP 协议处理强缓存、协商缓存,命中缓存直接返回,不走网络。
  4. ConnectInterceptor 连接拦截器 负责从连接池获取复用 Socket,建立 TCP 连接。
  5. CallServerInterceptor 网络拦截器真正和服务器建立通信,发送请求、读取响应数据。

执行顺序

请求:从上 → 下

响应:从下 → 上

5、拦截器顺序是固定的吗?

答案

系统内置 4 个拦截器顺序固定

自定义拦截器可以选择位置

  • addInterceptor () 加在最前面(应用拦截器)
  • addNetworkInterceptor () 加在缓存之后、网络请求之前

6、OkHttp 连接池原理

答案

  1. 相同域名的请求复用同一个 Socket 连接
  2. 不用每次请求都重新 TCP 三次握手、TLS 四次握手;
  3. 默认空闲连接保留 5 分钟,超时自动回收;
  4. 减少延迟、减少资源消耗、提升网络并发效率。

7、为什么 OkHttpClient 要全局单例?

答案

  1. OkHttpClient 内部维护连接池、线程池、缓存、拦截器
  2. 每次 new 都会新建独立连接池和线程池,无法复用连接,请求变慢、浪费内存;
  3. 单例保证全局共享连接池、线程池,最大化复用网络连接。

8、Call 可以重复执行吗?

答案

不可以

一个 Call 只能执行一次 execute /enqueue,重复调用直接抛异常。

需要重复请求:用 call.clone() 克隆新 Call。

9、OkHttp 缓存机制原理

答案遵循 HTTP 标准缓存:

  1. 强缓存 依赖 Cache-ControlExpires;没过期直接读本地缓存不发任何网络请求
  2. 协商缓存 依赖 ETag/If-None-MatchLast-Modified/If-Modified-Since;发请求和服务器校验,资源没更新返回 304,继续用本地缓存;更新了返回新数据。

10、OkHttp 四种超时分别是什么?

答案

  1. 连接超时:建立 TCP 握手超时。
  2. 读取超时:读取服务器响应数据超时。
  3. 写入超时:向服务器提交数据超时。
  4. 调用超时:整个请求全过程最大超时(包含重试、重定向)。

11、怎么用拦截器实现 Token 过期自动刷新?

答案

  1. 自定义拦截器拦截响应;
  2. 判断返回码 401/403 代表 Token 失效;
  3. 同步请求刷新 Token 接口,获取新 Token;
  4. 重新构造新 Request 带上新 Token;
  5. 重新发起原请求,对业务层无感知。

12、OkHttp 拦截器和网络拦截器区别

答案

1.应用拦截器 addInterceptor

最先执行,在缓存之前

能拦截缓存命中的请求;

适合统一 Header、日志。

2.网络拦截器 addNetworkInterceptor

在缓存之后、真正网络请求之前;

缓存命中不走这里;适合处理网络层面、请求重试。

13、OkHttp 怎么处理 HTTPS 证书?

答案

  1. 默认信任正规 CA 证书;
  2. 开发环境可忽略证书校验(自定义 SSLSocketFactory 绕过校验);
  3. 生产环境做证书固定(SSL Pinning),防止中间人抓包、劫持。

14、OkHttp 线程池原理

答案

OkHttp 内部自带异步请求线程池

自动控制最大并发数,不用开发者手动开子线程;

统一调度网络任务,避免并发过多造成网络阻塞、OOM。

15、OkHttp 重定向和重试机制

答案

默认自动支持 301/302 重定向;

网络失败、链路异常自动重试有限次数;

可手动关闭重定向、自定义重试策略。

16、OkHttp 和 Retrofit 关系

答案

  1. OkHttp:底层负责真实 Socket 网络通信、连接池、缓存、拦截器;
  2. Retrofit :基于 OkHttp 封装的注解式上层框架 ,简化接口定义、自动 Json 解析、适配协程;Retrofit 只是封装壳,底层网络完全依赖 OkHttp

17、OkHttp WebSocket 原理

答案

原生支持 WebSocket 长连接;

通过 newWebSocket() 建立全双工通信;

适合即时聊天、实时推送、设备长连接;

底层基于 HTTP/2 升级协议,保持长连接不断开。

18、OkHttp 责任链模式怎么理解?

答案

所有拦截器形成一条链表;

每个拦截器只处理自己关心的逻辑,然后交给下一个拦截器;

请求自上而下传递,响应自下而上回调;

解耦每一层职责,方便扩展、添加自定义逻辑。

面试一句话总结(背这句就能稳住)

OkHttp 是高性能网络框架,内置 5 层责任链拦截器、连接池复用 Socket、标准 HTTP 缓存、四种超时控制;必须全局单例,支持同步异步、HTTP2 和 WebSocket;通过拦截器统一处理日志、Header、Token 刷新;Retrofit 底层依赖 OkHttp,采用责任链模式分层处理请求与响应。

相关推荐
阿巴斯甜1 小时前
Flow
android
用户86022504674723 小时前
Claw 分析 Perfetto Trace
android
游戏开发爱好者84 小时前
使用Fiddler设置HTTPS抓包诊断Power Query网络问题
android·ios·小程序·https·uni-app·iphone·webview
阿巴斯甜5 小时前
Lifecycle
android
fengci.5 小时前
CTF+随机困难部分
android·开发语言·网络·安全·php
阿巴斯甜5 小时前
LiveData
android
OCN_Yang5 小时前
Android 开发:XML、Flutter、Compose 怎么选?
android
꯭爿꯭巎꯭5 小时前
壁纸引擎安卓版(wallpaper engine安卓版免费下载)
android
阿巴斯甜6 小时前
viewModel
android