如何使用 OKHttp 达成 HTTP/2 多路复用?

OKHttp 对 HTTP/2 多路复用提供了开箱即用的支持,无需手动编写复杂的协议逻辑,核心只需保证「服务端支持 HTTP/2」+「OKHttp 客户端启用 HTTP/2」,即可自动实现单个 TCP 连接上的多请求并发。以下是从「基础使用」到「进阶优化」的完整实现指南:

一、 核心前提(HTTP/2 多路复用的生效条件)

  1. 服务端必须支持 HTTP/2
    • 推荐使用 HTTPS(HTTP/2 官方推荐基于 TLS 部署,通过 ALPN 协议协商);
    • 若用 HTTP 明文传输(非推荐),需服务端支持 h2c(HTTP/2 Cleartext)。
  2. OKHttp 版本要求:OKHttp 3.0+ 已支持 HTTP/2,建议使用 4.x 最新版(如 4.12.0+)。
  3. 客户端配置:OKHttp 默认启用 HTTP/2,无需额外开关(仅需确保未禁用)。

二、 基础实现:快速启用 HTTP/2 多路复用

步骤 1:添加依赖

在 build.gradle 中引入 OKHttp(以 Android 为例):

dependencies {
    // OKHttp 核心依赖(4.x 版本)
    implementation 'com.squareup.okhttp3:okhttp:4.12.0'
    // 可选:日志拦截器(调试用)
    implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
}
步骤 2:创建 OKHttp 客户端(默认启用 HTTP/2)

OKHttp 客户端默认开启 HTTP/2,只需创建标准客户端即可:

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import java.util.concurrent.TimeUnit;
// 1. 配置日志拦截器(调试时查看协议版本)
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(message -> {
    // 打印请求/响应信息,可查看是否使用 HTTP/2
    System.out.println("OKHttp Log: " + message);
});
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); // 打印头信息(含协议版本)
// 2. 创建 OkHttpClient(默认启用 HTTP/2)
OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        // 可选:强制启用 HTTP/2(默认已启用,无需配置)
        // .protocols(Collections.singletonList(Protocol.HTTP_2))
        // 可选:禁用 HTTP/1.1(仅保留 HTTP/2)
posted on 2026-01-27 13:30  ljbguanli  阅读(0)  评论(0)    收藏  举报