讲师中心 微信公众号
AI工具推荐 视频效率加速

Java 11中的HttpClient类库全解析_异步非阻塞HTTP请求的新标准

梦萱酱_3274

梦萱酱_3274

发布时间:2026-02-11 12:07:23

|

825人浏览过

|

来源于php中文网

原创

Java 11 HttpClient 发最简GET请求需用HttpClient.newBuilder().build()创建客户端,HttpRequest.newBuilder(URI).GET().build()构建请求,并必须指定HttpResponse.BodyHandlers.ofString()处理响应体,再调用send()同步执行。

java 11中的httpclient类库全解析_异步非阻塞http请求的新标准

Java 11 HttpClient 怎么发一个最简 GET 请求

不用第三方库,Java 11 自带的 HttpClient 就能发请求,但写法和 Apache HttpClient 或 OkHttp 完全不同——它默认是异步非阻塞的,同步调用反而要显式等结果。

常见错误:直接 new HttpClient() 报错,因为构造器私有;或者漏掉 HttpResponse.BodyHandlers.ofString() 导致编译不通过。

  • HttpClient 必须用 HttpClient.newBuilder().build() 创建
  • GET 请求必须链式调用 HttpRequest.newBuilder(URI).GET().build()
  • 响应体处理器不能省,BodyHandlers.ofString() 返回 String,ofByteArray() 更适合二进制
  • 同步执行用 client.send(request, handler);异步用 client.sendAsync(request, handler).join()(注意 join() 才真正取值)

示例(同步):

var client = HttpClient.newBuilder().build();
var request = HttpRequest.newBuilder(URI.create("https://httpbin.org/get")).GET().build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

为什么 sendAsync 不立刻返回响应体,而要 .join() 或 .thenApply()

因为 sendAsync() 返回的是 CompletableFuture<httpresponse>></httpresponse>,不是结果本身。这是 Java 的标准异步抽象,不是 HttpClient 特有设计,但新手常误以为“异步=自动执行完”。

容易踩的坑:只调 sendAsync() 就结束,主线程退出,Future 还没完成,结果丢失;或在 Servlet 环境里用 join() 阻塞线程,拖垮吞吐量。

立即学习“Java免费学习笔记(深入)”;

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • 测试/命令行场景可用 .join() 简单等待
  • Web 应用中应链式用 .thenApply(r -> r.body()) + .thenAccept(System.out::println),避免阻塞
  • CompletableFuture 默认用 ForkJoinPool.commonPool(),高并发下可能需自定义线程池(通过 executor() 方法传入)

POST JSON 数据时 Content-Type 和 body 怎么配才不 400

400 Bad Request 多半是服务端没收到合法 JSON,根源常在两处:没设 Content-Type: application/json,或 body 没正确序列化为字节流。

Java 11 的 HttpRequest 不自动处理 JSON,也无内置序列化——你得自己转 String 再转 byte[],且必须指定 UTF-8 编码。

  • 用 HttpRequest.BodyPublishers.ofString(jsonStr, StandardCharsets.UTF_8),别用无参版本(默认 ISO-8859-1)
  • Header 必须显式加:header("Content-Type", "application/json")
  • 如果 JSON 含中文,UTF-8 编码缺失会导致服务端解析失败,错误日志可能只显示“invalid JSON”
  • 大 JSON 建议用 ofInputStream() 配合 BufferedInputStream,避免内存峰值

示例:

String json = "{\"name\":\"Alice\"}";
var request = HttpRequest.newBuilder(URI.create("https://httpbin.org/post"))
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(json, StandardCharsets.UTF_8))
        .build();

连接超时、读超时、重试这些怎么配

HttpClient 把超时拆得很细:连接建立超时(connect timeout)靠 connectTimeout(),但读超时(read timeout)没有独立 API——它由整个 send() 或 sendAsync() 调用的执行时间决定,需靠 CompletableFuture.orTimeout() 补齐。

重试完全不内置,得自己套逻辑。官方有意保持轻量,把策略交给上层。

  • 连接超时:用 HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5))
  • 读超时:对异步调用,加 .orTimeout(10, TimeUnit.SECONDS);同步调用只能靠 Thread.interrupt() 配合自定义 handler(不推荐)
  • 重试:用 CompletableFuture 的 handle() 捕获 IOException,再递归调用或循环重试,注意控制次数和退避(如 delay)
  • HTTP 状态码重试(如 503)需手动检查 response.statusCode(),HttpClient 不做语义重试

复杂点在于:超时和重试逻辑一旦嵌套,容易泄漏连接或重复提交。实际项目中,建议把重试+超时封装成工具方法,而不是每次手写。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2195

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3462

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1156

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3979

2025.09.10

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

1331

2023.08.08

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6759

2023.08.02

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4418

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

563

2025.12.01

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn