目录
一、OKHttp 的基本利用
1. 添加依靠
2. 发起 HTTP 哀求
3. 拦截器(Interceptor)
4. 高级配置
二、OKHttp 核心原理
1. 责任链模式(Interceptor Chain)
2. 毗连池(ConnectionPool)
3. 哀求调理(Dispatcher)
4. 缓存机制
5. 其他特性
三、拦截器工作原理
3.1 拦截器链的执行次序
3.2 五大拦截器的工作原理
3.3 拦截器协作流程图
3.4 关键场景分析
3.5 总结
四、常见问题与优化
五、总结
OKHttp 是一款高效的 HTTP 客户端库,由 Square 公司开发,支持 Android 和 Java 应用。它简化了 HTTP 哀求处理惩罚,支持同步/异步哀求、毗连池、缓存、拦截器等特性。以下是其利用流程图和原理的详细解析:
一、OKHttp 的基本利用
1. 添加依靠
在 Gradle 中添加依靠:
- implementation 'com.squareup.okhttp3:okhttp:4.9.3' // 最新版本以官方为准
复制代码 2. 发起 HTTP 哀求
同步哀求示例:
- OkHttpClient client = new OkHttpClient();
- Request request = new Request.Builder()
- .url("https://api.example.com/data")
- .build();
- try (Response response = client.newCall(request).execute()) {
- if (response.isSuccessful()) {
- String responseData = response.body().string();
- System.out.println(responseData);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
复制代码 注意: 同步哀求需在子线程执行(Android 中主线程克制网络操纵)。
异步哀求示例:
- client.newCall(request).enqueue(new Callback() {
- @Override
- public void onFailure(Call call, IOException e) {
- e.printStackTrace();
- }
- @Override
- public void onResponse(Call call, Response response) throws IOException {
- if (response.isSuccessful()) {
- String responseData = response.body().string();
- // 注意:回调在后台线程,需切换线程更新 UI
- }
- }
- });
复制代码 3. 拦截器(Interceptor)
拦截器用于监控、修改哀求和响应。例如添加统一哀求头:
- OkHttpClient client = new OkHttpClient.Builder()
- .addInterceptor(new Interceptor() {
- @Override
- public Response intercept(Chain chain) throws IOException {
- Request originalRequest = chain.request();
- Request newRequest = originalRequest.newBuilder()
- .header("Authorization", "Bearer token")
- .build();
- return chain.proceed(newRequest);
- }
- })
- .build();
复制代码 4. 高级配置
- OkHttpClient client = new OkHttpClient.Builder()
- .connectTimeout(10, TimeUnit.SECONDS) // 连接超时
- .readTimeout(30, TimeUnit.SECONDS) // 读取超时
- .writeTimeout(30, TimeUnit.SECONDS) // 写入超时
- .cookieJar(new CookieJar() { // Cookie 管理
- private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
- @Override
- public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
- cookieStore.put(url, cookies);
- }
- @Override
- public List<Cookie> loadForRequest(HttpUrl url) {
- return cookieStore.getOrDefault(url, new ArrayList<>());
- }
- })
- .build();
复制代码 二、OKHttp 核心原理
1. 责任链模式(Interceptor Chain)
OKHttp 的核心是 拦截器链,每个哀求会依次颠末多个拦截器处理惩罚:
- 自界说拦截器:开发者添加的拦截器,最先执行。
- RetryAndFollowUpInterceptor:处理惩罚重定向和失败重试。
- BridgeInterceptor:补全哀求头(如 Content-Type、Cookie)。
- CacheInterceptor:根据缓存策略返回缓存或哀求网络。
- ConnectInterceptor:建立与服务器的毗连(复用毗连池中的毗连)。
- CallServerInterceptor:向服务器发送哀求并读取响应。
2. 毗连池(ConnectionPool)
- 作用:复用 TCP 毗连,减少握手开销。
- 默认配置:最大空闲毗连数 5,存活时间 5 分钟。
- 实现:通过 RealConnectionPool 管理空闲毗连,清理过期毗连。
3. 哀求调理(Dispatcher)
- 同步哀求:直接执行,但需开发者自行管理线程。
- 异步哀求:通过 Dispatcher 管理线程池,默认最大并发哀求数 64,单个域名最大并发 5。
4. 缓存机制
- 基于 HTTP 缓存协议(如 Cache-Control、ETag)。
- 缓存目录需开发者指定,通过 Cache 类配置:
- Cache cache = new Cache(context.getCacheDir(), 10 * 1024 * 1024); // 10MB 缓存
- OkHttpClient client = new OkHttpClient.Builder().cache(cache).build();
复制代码 5. 其他特性
- HTTP/2 支持:多路复用、头部压缩。
- WebSocket:通过 okhttp-ws 模块支持长毗连。
- HTTPS:支持 TLS 1.3,可配置证书校验策略。
三、拦截器工作原理
OKHttp 的五大核心拦截器构成了其高效的网络哀求处理惩罚链,每个拦截器职责明白,协同工作。以下是它们的详细工作流程和原理:
3.1 拦截器链的执行次序
OKHttp 的哀求处理惩罚基于责任链模式,五大核心拦截器按固定次序依次处理惩罚哀求和响应:哀求从第一个拦截器进入,渐渐通报到最后一个拦截器(CallServerInterceptor),响应则逆向返回。
3.2 五大拦截器的工作原理
1. RetryAndFollowUpInterceptor
核心职责:处理惩罚哀求失败的重试与重定向。
- 重试机制:
若哀求因网络问题(如毗连超时、IO 异常)失败,根据配置决定是否重试(默认最多 20 次)。
- 重定向处理惩罚:
若服务器返回 3xx 状态码(如 302 临时跳转),主动构建新哀求并重新发起。
- 流程示例:
- Request → RetryAndFollowUpInterceptor → 发送请求 → 失败 → 判断是否重试 → 重新执行链
- Response ← 处理重定向 → 生成新 Request → 重新执行链
复制代码 2. BridgeInterceptor
核心职责:桥接应用代码与网络哀求,补充哀求头、处理惩罚 Cookie 和响应编码。
- 哀求头补充:
主动添加 User-Agent、Host、Content-Type 等头信息。
若哀求体为 RequestBody,主动盘算 Content-Length。
- Cookie 管理:
通过 CookieJar 读取哀求对应的 Cookie,写入 Cookie 头;保存响应中的 Set-Cookie。
- 响应解码:
若响应头包罗 Content-Encoding: gzip,主动解压响应体。
3. CacheInterceptor
核心职责:根据缓存策略管理本地缓存,减少重复哀求。
- 缓存命中逻辑:
- 根据哀求生成缓存 Key,检查本地是否有有用缓存。
- 若缓存未过期且有用(如 Cache-Control: max-age=3600),直接返回缓存响应,不再执行后续拦截器。
- 缓存更新逻辑:
- 若缓存过期或必要验证(如 Cache-Control: no-cache),添加条件头(如 If-Modified-Since)发起哀求。
- 若服务器返回 304 Not Modified,更新缓存元数据并返回缓存响应。
- 若服务器返回新数据,写入缓存。
-
4. ConnectInterceptor
核心职责:建立与服务器的 TCP/TLS 毗连,复用毗连池。
- 毗连复用机制:
- 根据哀求的 URL、署理配置等生成毗连标识(Address)。
- 从毗连池(ConnectionPool)中查找可用毗连,若存在则复用。
- 若无可用毗连,创建新毗连并到场毗连池。
- 毗连释放:
哀求完成后,毗连被标记为空闲,毗连池根据策略(默认最大空闲毗连数 5,存活时间 5 分钟)清理过期毗连。
5. CallServerInterceptor
核心职责:执行实际的网络 I/O 操纵,发送哀求并读取响应。
- 哀求发送:
- 将哀求头写入网络流。
- 如有哀求体(如 POST 数据),分块写入流。
- 响应接收:
- 读取响应头(如状态码、Content-Type)。
- 读取响应体,支持分块传输(Transfer-Encoding: chunked)。
- 资源管理:
确保哀求和响应流正确关闭,异常时释放毗连。
3.3 拦截器协作流程图
- 请求发起 → RetryAndFollowUpInterceptor(重试/重定向)
- ↓
- BridgeInterceptor(补全请求头)
- ↓
- CacheInterceptor(查询缓存)
- ↓
- ConnectInterceptor(建立连接)
- ↓
- CallServerInterceptor(发送请求)
- 响应返回 ← CallServerInterceptor(读取响应)
- ↑
- ConnectInterceptor(释放连接)
- ↑
- CacheInterceptor(更新缓存)
- ↑
- BridgeInterceptor(解压响应)
- ↑
- RetryAndFollowUpInterceptor(处理最终结果)
复制代码 3.4 关键场景分析
场景 1:缓存命中
- 哀求到达 CacheInterceptor,发现有用缓存。
- 直接返回缓存响应,后续拦截器(如 ConnectInterceptor)不再执行。
- 节省网络开销,提升响应速率。
场景 2:重定向处理惩罚
- CallServerInterceptor 收到 302 响应。
- 响应返回到 RetryAndFollowUpInterceptor,生成新哀求。
- 重新执行整个拦截器链,直到乐成或超出重试次数。
3.5 总结
OKHttp 通过五大拦截器的分工协作,实现了高效、机动的网络哀求处理惩罚:
- RetryAndFollowUpInterceptor:保障哀求的可靠性。
- BridgeInterceptor:简化开发,主动处理惩罚协议细节。
- CacheInterceptor:优化性能,减少重复哀求。
- ConnectInterceptor:从毗连池中复用已有毗连,跳过 TCP/TLS 握手,降低耽误。。
- CallServerInterceptor:完成终极的网络 I/O。
理解拦截器链的流程,有助于开发者定制拦截器(如日记打印、加密)或优化网络行为(如缓存策略、毗连池配置)。
四、常见问题与优化
- 内存走漏
- 确保 Callback 或 Call 在 Activity/Fragment 销毁时取消:
- private Call call;
- call = client.newCall(request);
- call.enqueue(callback);
- // 在 onDestroy() 中取消
- if (call != null) call.cancel();
复制代码
- 全局配置
- 推荐将 OkHttpClient 实例化为单例,克制重复创建毗连池。
- 自界说 DNS
- 更换默认 DNS 以优化解析:
- client = new OkHttpClient.Builder()
- .dns(hostname -> {
- // 自定义 DNS 解析逻辑
- return InetAddress.getAllByName(hostname);
- })
- .build();
复制代码
五、总结
OKHttp 的上风:
- 高效:毗连池、HTTP/2 支持、缓存机制。
- 机动:拦截器链可深度定制哀求流程。
- 易用:简洁的 API 设计,支持同步/异步调用。
实用场景:移动端 API 调用、文件下载/上传、必要精致控制网络行为的场景。
通过理解其原理,开发者能更好地优化网络层设计(如统一日记、哀求加密、性能监控),并高效办理实际问题。
其它推荐:
《RxJava 深度解析:工作原理、核心操纵符与高效实践指南》
《Binder机制原理分析· AIDL示例详解》
《Android View 的事件分发机制解析》
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |