0

0

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

P粉602998670

P粉602998670

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

|

785人浏览过

|

来源于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() 返回 StringofByteArray() 更适合二进制
  • 同步执行用 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>,不是结果本身。这是 Java 的标准异步抽象,不是 HttpClient 特有设计,但新手常误以为“异步=自动执行完”。

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

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

  • 测试/命令行场景可用 .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 没正确序列化为字节流。

Interior AI
Interior AI

AI室内设计,上传室内照片自动帮你生成多种风格的室内设计图

下载

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(不推荐)
  • 重试:用 CompletableFuturehandle() 捕获 IOException,再递归调用或循环重试,注意控制次数和退避(如 delay
  • HTTP 状态码重试(如 503)需手动检查 response.statusCode()HttpClient 不做语义重试

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

436

2023.08.07

json是什么
json是什么

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

544

2023.08.23

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

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

317

2023.10.13

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

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

81

2025.09.10

servlet生命周期
servlet生命周期

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

382

2023.08.08

string转int
string转int

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

688

2023.08.02

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

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

653

2023.08.10

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

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

653

2023.08.10

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

68

2026.02.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.2万人学习

Java 教程
Java 教程

共578课时 | 63.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号