OkHttp3 - 2. OkHttp的焦点组件与架构

打印 上一主题 下一主题

主题 975|帖子 975|积分 2935

1 OkHttp的工作原理

OkHttp3 的焦点设计遵循以下原则:

  • 请求与响应的分离:通过 Request 和 Response 对象解耦请求构建与结果处理。
  • 异步与同步支持:使用 Call 对象管理请求,可以同步或异步执行。
  • 高效连接复用:通过连接池管理 TCP 连接,支持 HTTP/2 多路复用,淘汰耽误。
  • 可扩展的中间层:拦截器链路设计使得可以插入自定义逻辑。
工作流程图

  • 构建 Request 对象
  • 创建 Call 对象
  • 调用同步或异步方法发送请求
  • 通过拦截器链处理请求和响应
  • 剖析响应返回给调用者

2 焦点类和接口剖析

OkHttp3 的焦点组件如下:
1. OkHttpClient

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


  • 管理连接池
  • 分发请求
  • 设置超时、拦截器、DNS 等
代码示例
  1. OkHttpClient client = new OkHttpClient.Builder()
  2.         .connectTimeout(10, TimeUnit.SECONDS)
  3.         .readTimeout(30, TimeUnit.SECONDS)
  4.         .writeTimeout(10, TimeUnit.SECONDS)
  5.         .build();
复制代码
** Request**

Request 是 HTTP 请求的抽象,包含 URL、方法、Header、Body 等信息。
代码示例
  1. Request request = new Request.Builder()
  2.         .url("https://jsonplaceholder.typicode.com/posts")
  3.         .get() // 默认是 GET 请求
  4.         .addHeader("User-Agent", "OkHttp Example")
  5.         .build();
复制代码
3. Call

Call 是对一次请求的封装,可以执行同步或异步操作。
代码示例
  1. Call call = client.newCall(request);
复制代码
4. Response

Response 表示 HTTP 响应,包含状态码、Header、响应体等信息。
代码示例
  1. Response response = call.execute(); // 同步调用
复制代码
5. Interceptor

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


  • 添加日记
  • 缓存控制
  • 动态修改请求
代码示例
  1. client = new OkHttpClient.Builder()
  2.         .addInterceptor(chain -> {
  3.             Request original = chain.request();
  4.             Request modified = original.newBuilder()
  5.                     .addHeader("Authorization", "Bearer token")
  6.                     .build();
  7.             return chain.proceed(modified);
  8.         })
  9.         .build();
复制代码

3 同步与异步请求机制

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

同步请求在当火线程执行,调用 Call.execute() 方法,线程将被阻塞直到响应返回。
代码示例
  1. try (Response response = client.newCall(request).execute()) {
  2.     System.out.println(response.body().string());
  3. } catch (IOException e) {
  4.     e.printStackTrace();
  5. }
复制代码
** 异步请求**

异步请求在独立线程中执行,调用 Call.enqueue() 方法,结果通过回调处理。
代码示例
  1. call.enqueue(new Callback() {
  2.     @Override
  3.     public void onFailure(Call call, IOException e) {
  4.         e.printStackTrace();
  5.     }
  6.     @Override
  7.     public void onResponse(Call call, Response response) throws IOException {
  8.         if (response.isSuccessful() && response.body() != null) {
  9.             System.out.println(response.body().string());
  10.         }
  11.     }
  12. });
复制代码
同步与异步对比

特性同步调用异步调用调用方式阻塞非阻塞使用场景简单的单线程应用多线程或高并发场景难度易于实现需实现回调逻辑
4 Dispatcher与线程调度

Dispatcher 的作用



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

默认情况下,OkHttp 的最大并发请求数为 64,总主机最大请求数为 5。可以通过 Dispatcher 自定义这些限定:
  1. Dispatcher dispatcher = new Dispatcher();
  2. dispatcher.setMaxRequests(128);
  3. dispatcher.setMaxRequestsPerHost(10);
  4. OkHttpClient client = new OkHttpClient.Builder()
  5.         .dispatcher(dispatcher)
  6.         .build();
复制代码
监控请求队列状态

Dispatcher 提供方法获取正在运行和等候的请求信息:
  1. System.out.println("正在运行的请求数: " + dispatcher.runningCallsCount());
  2. System.out.println("等待队列中的请求数: " + dispatcher.queuedCallsCount());
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表