JDK 26:HTTP/3 支持已可在 HTTP 客户端 API 中使用

java.net.http.HttpClient API 允许 Java 应用创建可重用的 HTTP 客户端实例,构建 HTTP 请求,并同步或异步处理响应。自 JDK 11 起,你可以在 HttpClientHttpRequest 层设置首选的 HTTP 协议版本,如 HTTP/1.1 或 HTTP/2。

JEP 517 在 JDK 26 中引入了对 HTTP/3( HttpClient.Version.HTTP_3 )的支持,使应用能够为请求优先选择或强制使用 HTTP/3。虽然 HTTP/3 在协议级别提供了与 HTTP/2 类似的功能,但其关键区别在于它使用 UDP 基于 QUIC 协议运行,而 HTTP/2 基于 TCP 运行。以下是一个代码片段,展示了如何优先选择或强制使用 HTTP/3:

java 复制代码
// prefer HTTP/3
HttpClient client = HttpClient.newBuilder()
    .version(HttpClient.Version.HTTP_3)
    .build();

// if target server support HTTP/3, add this to enforce it
HttpRequest req = HttpRequest.newBuilder()
    .uri(new URI("https://www.google.com/"))
    .setOption(HttpOption.H3_DISCOVERY, Http3DiscoveryMode.HTTP_3_URI_ONLY)
    .build();

HttpResponse<String> resp = client.send(req, BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println("status code: " + resp.statusCode() + " HTTP protocol version: " + resp.version());

如果你设置了 HTTP/3 但它不可用,客户端将自动降级到 HTTP/2 或 HTTP/1.1。如果你配置为严格要求 HTTP/3,失败尝试将导致异常而不是降级。

然而,将 HTTP/3 设为首选版本并不能保证其使用,因为客户端无法事先知道服务器是否支持它。对于首次向服务器发起请求时,客户端会尝试 TCP(HTTP/2)和 UDP(HTTP/3)两种连接,并使用第一个成功的连接。随着时间的推移,客户端可以通过使用"Alt-Svc"机制(根据 RFC 7838 的"HTTP Alternative Services"标准)来"学习"服务器支持的 HTTP 版本。支持"Alt-Svc"的服务器会宣传替代支持的协议,如 HTTP/3。这允许后续请求在服务器支持时使用 HTTP/3。

相关推荐
秋98 小时前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
huangdong_9 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
马士兵教育9 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
chase_my_dream9 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
snow@li9 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
Cloud_Shy6189 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
云烟成雨TD10 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework10 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
天佑木枫10 小时前
15天Python入门系列 · 序
开发语言·python
逍遥德10 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt