网络请求与 Retrofit 面试知识点整理

整理自模拟面试,覆盖 OkHttp、HTTPS、拦截器、Retrofit、动态代理、ServiceMethod 缓存,以及结合 PicPat widget 的责任链类比


一、OkHttp 核心原理

一句话

核心组件

一次请求的主流程

  1. 业务层构建 Request
  2. OkHttpClient.newCall(request) 生成 Call
  3. 异步场景由 Dispatcher 调度执行
  4. 请求进入拦截器链
  5. 尝试从连接池获取可复用连接,否则执行 DNS、TCP、TLS 握手
  6. 写出请求数据并读取响应
  7. 解析为 Response 返回给调用方

为什么 OkHttp 性能好


二、OkHttp 拦截器机制

本质

典型执行顺序

Interceptor A before
  Interceptor B before
    Interceptor C before
      发起网络请求
    Interceptor C after
  Interceptor B after
Interceptor A after

内置拦截器的职责

  1. RetryAndFollowUpInterceptor
    负责失败重试、重定向、部分鉴权跟进
  2. BridgeInterceptor
    补齐协议层请求头,处理 gzip、cookie 等桥接逻辑
  3. CacheInterceptor
    根据 HTTP 缓存语义决定走缓存、网络还是条件请求
  4. ConnectInterceptor
    建立连接或从连接池中复用连接
  5. CallServerInterceptor
    真正执行网络 I/O,把请求写到服务端并读取响应

Application Interceptor 和 Network Interceptor 的区别

常见注意点


三、HTTPS / TLS 加密

一句话

HTTPS 主要解决的问题

  1. 机密性:传输内容不会被旁路明文看到
  2. 完整性:数据被篡改时能够被发现
  3. 身份认证:客户端能确认访问的是目标服务端,而不是中间人

为什么是混合加密

原因:
- 非对称加密安全但开销大
- 对称加密速度快,适合传输大量数据

TLS 握手流程

  1. Client Hello
    客户端发出支持的 TLS 版本、加密套件、随机数、扩展能力
  2. Server Hello
    服务端返回选中的 TLS 版本、加密套件、随机数和证书链
  3. 客户端校验证书
    校验证书链、域名、有效期、签名等
  4. 密钥协商
    现代 TLS 常用 ECDHE 等方式协商会话密钥
  5. 开始对称加密通信
    后续 HTTP 数据主要用协商出的会话密钥传输

OkHttp 里的 HTTPS 关注点

面试易错点


四、Retrofit 是如何包装 OkHttp 的

一句话

职责划分

从接口调用到网络请求的流程

  1. Retrofit.create(ApiService::class.java) 生成动态代理对象
  2. 调用接口方法时,代理对象拦截方法调用
  3. Retrofit 解析注解、参数和返回值类型
  4. 把方法信息组织成请求模型
  5. 构建底层 OkHttp Request
  6. 创建并委托底层 OkHttp Call
  7. 通过 CallAdapter 适配成 Call<T>、协程、RxJava 等形式
  8. 通过 ConverterResponseBody 转成业务对象

Converter 和 CallAdapter 的职责


五、Retrofit 动态代理原理

本质

工作流程

  1. create() 时用 Proxy.newProxyInstance() 创建接口代理对象
  2. 调用接口方法时拿到:
  3. 当前 Method
  4. 方法注解
  5. 参数值和参数注解
  6. 返回值类型
  7. Retrofit 把这个 Method 解析成内部的 ServiceMethod
  8. 再把本次调用参数套入模板,生成请求
  9. 创建底层 OkHttp Call
  10. ConverterCallAdapter 完成结果转换与调用适配

为什么动态代理不是 Retrofit 的核心本质

结论:
- 注解解析才是 Retrofit 的核心
- 动态代理更像是调用入口和承载方式


六、ServiceMethod 缓存

是什么

生命周期

加载时机

会不会有性能问题

是否支持初始化时全部预加载


七、为什么有时直接用 OkHttp,不一定用 Retrofit

更适合直接用 OkHttp 的场景

更适合 Retrofit 的场景


八、结合 PicPat 项目理解责任链

类比点

对应关系

典型层级

为什么这里用责任链,不直接用 Builder

partial update 怎么和 Layer 配合

典型例子:
- 头像变化:只复用 AvatarLayer
- 皮肤变化:可走完整链,也可走裁剪后的皮肤相关子链
- 照片变化:如果联动 shape、frame、pendant,很多时候直接走更稳妥的全量更新


九、一句话速记

知识点 速记
OkHttp 本质 高性能 HTTP 客户端,负责连接、调度、缓存、拦截器
Interceptor 责任链模式,请求正向走,响应反向回
HTTPS HTTP + TLS,解决机密性、完整性、身份认证
Retrofit 在 OkHttp 之上做声明式接口包装
动态代理 负责接住接口调用,不是 Retrofit 的核心本质
注解解析 把接口方法翻译成请求模型,才是 Retrofit 核心
ServiceMethod 接口方法解析结果模板,挂在 Retrofit 实例内缓存
反射性能 有一次性开销,但通常不是网络场景主瓶颈
PicPat 类比 widget 分层装饰链,本质上是 UI 版 Interceptor 思路