在 Java 中调用 API 时,针对 HTTP/1.1、HTTP/2、HTTP/3 三种协议,可选择不同的客户端库实现。以下是最常用的方案及代码示例,覆盖同步 / 异步调用场景:

对比维度HTTP/1.1HTTP/2HTTP/3
底层传输协议基于 TCP基于 TCP基于 QUIC(UDP 之上的协议)
传输方式文本格式(明文,易读但解析慢)二进制帧(结构化,解析快、省带宽)二进制帧(沿用 HTTP/2 帧结构)
多路复用能力无(串行请求,存在 “队头阻塞”)支持(单 TCP 连接多流并行,无队头阻塞)支持(单 QUIC 连接多流,无 TCP 队头阻塞)
头部压缩无(重复头部全量传输,占带宽)有(HPACK 算法,压缩率 70%+)有(沿用 HPACK,或升级为 QPACK)
服务器推送无(被动响应请求)有(主动推送依赖资源)有(功能与 HTTP/2 一致)
队头阻塞问题严重(TCP 层 + 应用层双重阻塞)缓解(解决应用层阻塞,仍有 TCP 阻塞)彻底解决(QUIC 流独立重传,无阻塞)
连接建立延迟高(TCP 三次握手 + TLS 四次握手)高(同 HTTP/1.1,依赖 TCP+TLS)低(QUIC 0-RTT 重连,合并握手流程)
主流支持度100%(所有服务器 / 客户端)90%+(主流浏览器 / 服务器均支持)70%+(逐步普及,依赖 QUIC 支持)

一、HTTP/1.1 实现(最成熟,兼容性最好)

推荐库:Apache HttpClient 5.x(同步)或 OkHttp(支持同步 / 异步)

HTTP/1.1 是默认协议,大多数客户端库原生支持,无需额外配置。

示例 1:Apache HttpClient 5.x(同步调用)

java

运行

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.io.entity.EntityUtils;

public class Http1Client {
    public static void main(String[] args) throws Exception {
        // 创建 HTTP/1.1 客户端(默认支持)
        try (CloseableHttpClient client = HttpClients.createDefault()) {
            // 构建请求(示例 API:获取IP信息)
            HttpGet request = new HttpGet("https://api.ipify.org?format=json");
            
            // 发送请求并处理响应
            client.execute(request, response -> {
                System.out.println("协议版本:" + response.getVersion()); // HTTP/1.1
                System.out.println("状态码:" + response.getCode());
                String responseBody = EntityUtils.toString(response.getEntity());
                System.out.println("响应内容:" + responseBody);
                return null;
            });
        }
    }
}
示例 2:OkHttp(支持同步 / 异步,自动兼容 HTTP/1.1)

java

运行

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttp1Client {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();
        
        // 同步调用
        Request request = new Request.Builder()
                .url("https://api.ipify.org?format=json")
                .build();
        
        try (Response response = client.newCall(request).execute()) {
            System.out.println("协议版本:" + response.protocol()); // HTTP/1.1
            System.out.println("响应内容:" + response.body().string());
        }
    }
}

二、HTTP/2 实现(高性能,支持多路复用)

推荐库:OkHttp(最简单)或 Apache HttpClient 5.x(需配置 ALPN)

HTTP/2 需服务器支持,客户端需通过 TLS 握手时的 ALPN 协议协商启用。

示例:OkHttp 调用 HTTP/2 API(自动协商协议)

OkHttp 会自动检测服务器是否支持 HTTP/2,无需额外配置:

java

运行

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttp2Client {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();
        
        Request request = new Request.Builder()
                .url("https://http2.pro/api/v1") // 支持 HTTP/2 的测试 API
                .build();
        
        try (Response response = client.newCall(request).execute()) {
            System.out.println("协议版本:" + response.protocol()); // 若服务器支持则为 HTTP/2
            System.out.println("响应内容:" + response.body().string());
        }
    }
}
说明:
  • OkHttp 会优先尝试 HTTP/2,若服务器不支持则降级为 HTTP/1.1。
  • 需确保服务器启用 HTTPS(HTTP/2 通常依赖 TLS,非加密场景很少见)。

三、HTTP/3 实现(基于 QUIC,低延迟)

推荐库:OkHttp 5.x(实验性支持)或 Netty(需手动配置 QUIC)

HTTP/3 基于 QUIC 协议(UDP),目前生态尚在完善中,需使用支持 QUIC 的客户端。

示例:OkHttp 5.x 实验性调用 HTTP/3 API

OkHttp 5.x 开始支持 HTTP/3(需显式启用):

java

运行

import okhttp3.ConnectionSpec;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.tls.HandshakeCertificates;
import okhttp3.tls.HeldCertificate;

import java.util.Arrays;

public class OkHttp3Client {
    public static void main(String[] args) throws Exception {
        // 配置支持 HTTP/3 的连接规格(实验性)
        ConnectionSpec http3Spec = new ConnectionSpec.Builder(ConnectionSpec.RESTRICTED_TLS)
                .supportsTlsExtensions(true)
                .tlsVersions(TlsVersion.TLS_1_3) // HTTP/3 通常依赖 TLS 1.3
                .build();

        OkHttpClient client = new OkHttpClient.Builder()
                .connectionSpecs(Arrays.asList(http3Spec, ConnectionSpec.RESTRICTED_TLS))
                .enableHttp3(true) // 启用 HTTP/3(实验性 API)
                .build();

        // 调用支持 HTTP/3 的服务器(如 Cloudflare 测试节点)
        Request request = new Request.Builder()
                .url("https://cloudflare-quic.com/")
                .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println("协议版本:" + response.protocol()); // 若支持则为 HTTP/3
            System.out.println("响应内容:" + response.body().string());
        }
    }
}
依赖配置(Maven):

xml

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>5.0.0-alpha.11</version> <!-- 需 5.x 版本 -->
</dependency>
说明:
  • HTTP/3 目前为实验性协议,服务器支持有限(如 Cloudflare、Google)。
  • OkHttp 的 HTTP/3 支持仍在开发中,API 可能变动。

四、三种协议实现对比

协议推荐库核心依赖 / 配置适用场景
HTTP/1.1Apache HttpClient 5.x、OkHttp无特殊配置兼容性优先,简单 API 调用
HTTP/2OkHttp、Apache HttpClient 5.x需服务器支持,依赖 ALPN 协商高性能场景(多请求、小数据)
HTTP/3OkHttp 5.x(实验性)、Netty依赖 QUIC 协议,需 TLS 1.3低延迟、抗丢包(如移动端)

五、生产环境建议

  1. 优先使用 OkHttp:对 HTTP/1.1、HTTP/2 支持成熟,HTTP/3 有实验性支持,API 简洁,适合大多数场景。
  2. 兼容性处理:若需兼容旧服务器,客户端应支持协议降级(如 HTTP/2 降级到 HTTP/1.1)。
  3. HTTPS 配置:HTTP/2 和 HTTP/3 通常要求 HTTPS,需正确配置证书验证(避免生产环境使用不安全的信任管理器)。
  4. 性能监控:对 HTTP/2 和 HTTP/3,建议监控连接复用率、头部压缩效率等指标,评估协议收益。

根据 API 服务器支持的协议和业务性能需求,选择最合适的实现方式即可。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐