OkHttp3 - 2. OkHttp的核心组件与架构
1 OkHttp的工作原理
OkHttp3 的核心设计遵循以下原则:
- 请求与响应的分离:通过
Request
和Response
对象解耦请求构建与结果处理。 - 异步与同步支持:使用
Call
对象管理请求,可以同步或异步执行。 - 高效连接复用:通过连接池管理 TCP 连接,支持 HTTP/2 多路复用,减少延迟。
- 可扩展的中间层:拦截器链路设计使得可以插入自定义逻辑。
工作流程图:
- 构建
Request
对象 - 创建
Call
对象 - 调用同步或异步方法发送请求
- 通过拦截器链处理请求和响应
- 解析响应返回给调用者
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());