当前位置: 首页 > article >正文

OkHttp3 - 2. OkHttp的核心组件与架构

1 OkHttp的工作原理

OkHttp3 的核心设计遵循以下原则:

  1. 请求与响应的分离:通过 RequestResponse 对象解耦请求构建与结果处理。
  2. 异步与同步支持:使用 Call 对象管理请求,可以同步或异步执行。
  3. 高效连接复用:通过连接池管理 TCP 连接,支持 HTTP/2 多路复用,减少延迟。
  4. 可扩展的中间层:拦截器链路设计使得可以插入自定义逻辑。

工作流程图

  1. 构建 Request 对象
  2. 创建 Call 对象
  3. 调用同步或异步方法发送请求
  4. 通过拦截器链处理请求和响应
  5. 解析响应返回给调用者

2 核心类和接口解析

OkHttp3 的核心组件如下:

1. OkHttpClient

OkHttpClient 是 HTTP 客户端的核心类,用于管理请求和连接配置。
主要功能

  • 管理连接池
  • 分发请求
  • 配置超时、拦截器、DNS 等

代码示例

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .build();
** Request**

Request 是 HTTP 请求的抽象,包含 URL、方法、Header、Body 等信息。
代码示例

Request request = new Request.Builder()
        .url("https://jsonplaceholder.typicode.com/posts")
        .get() // 默认是 GET 请求
        .addHeader("User-Agent", "OkHttp Example")
        .build();
3. Call

Call 是对一次请求的封装,可以执行同步或异步操作。
代码示例

Call call = client.newCall(request);
4. Response

Response 表示 HTTP 响应,包含状态码、Header、响应体等信息。
代码示例

Response response = call.execute(); // 同步调用
5. Interceptor

拦截器用于在请求发送和响应返回时插入自定义逻辑。
常见用途

  • 添加日志
  • 缓存控制
  • 动态修改请求

代码示例

client = new OkHttpClient.Builder()
        .addInterceptor(chain -> {
            Request original = chain.request();
            Request modified = original.newBuilder()
                    .addHeader("Authorization", "Bearer token")
                    .build();
            return chain.proceed(modified);
        })
        .build();

3 同步与异步请求机制

OkHttp3 支持同步和异步两种请求方式:

1. 同步请求

同步请求在当前线程执行,调用 Call.execute() 方法,线程将被阻塞直到响应返回。
代码示例

try (Response response = client.newCall(request).execute()) {
    System.out.println(response.body().string());
} catch (IOException e) {
    e.printStackTrace();
}
** 异步请求**

异步请求在独立线程中执行,调用 Call.enqueue() 方法,结果通过回调处理。
代码示例

call.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() && response.body() != null) {
            System.out.println(response.body().string());
        }
    }
});
同步与异步对比
特性同步调用异步调用
调用方式阻塞非阻塞
使用场景简单的单线程应用多线程或高并发场景
难度易于实现需实现回调逻辑

4 Dispatcher与线程调度

Dispatcher 的作用
  • 管理异步请求的队列和执行线程池
  • 限制最大并发请求数
  • 确保请求按序完成
默认配置与修改

默认情况下,OkHttp 的最大并发请求数为 64,总主机最大请求数为 5。可以通过 Dispatcher 自定义这些限制:

Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(128);
dispatcher.setMaxRequestsPerHost(10);

OkHttpClient client = new OkHttpClient.Builder()
        .dispatcher(dispatcher)
        .build();
监控请求队列状态

Dispatcher 提供方法获取正在运行和等待的请求信息:

System.out.println("正在运行的请求数: " + dispatcher.runningCallsCount());
System.out.println("等待队列中的请求数: " + dispatcher.queuedCallsCount());

http://www.kler.cn/a/412497.html

相关文章:

  • 数据结构C语言描述5(图文结合)--队列,数组、链式、优先队列的实现
  • 【一篇搞定配置】网络分析工具WireShark的安装与入门使用
  • Shell脚本实践练习
  • 简单的TCPSocket客户端使用案例(已入OPCommon)
  • 40分钟学 Go 语言高并发:Select多路复用
  • 【python量化教程】如何使用必盈API的股票接口,获取最新实时交易数据
  • 机器学习模型——线性回归
  • 数据链路层(一)-使用点对点信道的数据链路层
  • Edge浏览器保留数据,无损降级退回老版本+禁止更新教程(适用于Chrome)
  • 深度理解进程的概念(Linux)
  • 【C#设计模式(15)——命令模式(Command Pattern)】
  • 数据结构——排序算法第二幕(交换排序:冒泡排序、快速排序(三种版本) 归并排序:归并排序(分治))超详细!!!!
  • MQ高级1:消息可靠性问题、生产者可靠性
  • STM32F4系列单片机新玩法---Micropython--pyBoard
  • PHP实现终端表格提取
  • Three.js 和其他 WebGL 库 对比
  • Docker--将镜像推送到阿里云仓库中
  • linux上离线部署Mysql5.7.22
  • 5.1 MySQL 锁机制
  • 【pyspark学习从入门到精通22】机器学习库_5