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。

相关推荐
程序员萌萌1 分钟前
Java之mysql实战讲解(三):聚簇索引与非聚簇索引
java·mysql·聚簇索引
天若有情67311 分钟前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
好家伙VCC15 分钟前
**发散创新:基于Python与ROS的机器人运动控制实战解析**在现代机器人系统开发中,**运动控制**是实现智能行为的核心
java·开发语言·python·机器人
2401_8274999915 分钟前
python项目实战09-AI智能伴侣(ai_partner_2-3)
开发语言·python
派葛穆18 分钟前
汇川PLC-Python与汇川easy521plc进行Modbustcp通讯
开发语言·python
程途知微1 小时前
ConcurrentHashMap线程安全实现原理全解析
java·后端
lzhdim1 小时前
SharpCompress:跨平台的 C# 压缩与解压库
开发语言·c#
嘿嘿嘿x31 小时前
Linux记录过程
linux·开发语言
Mars酱1 小时前
1分钟编写贪吃蛇 | JSnake贪吃蛇单机版
java·后端·开源
devpotato1 小时前
人工智能(四)- Function Calling 核心原理与实战
java·人工智能