Java 11+内置HttpClient支持同步和异步两种模式:同步调用send()阻塞获取HttpResponse,异步调用sendAsync()返回CompletableFuture,可链式处理结果与异常,并支持超时设置、多种BodyPublisher/BodyHandler及线程安全复用。

Java 中使用 HttpClient(来自 java.net.http,JDK 11+ 内置)发送 HTTP 请求非常简洁。它原生支持同步和异步两种模式,无需额外依赖。
同步请求:直接获取响应结果
同步调用会阻塞当前线程,直到响应返回。适合简单场景或主线程中可控的 I/O 操作。
关键步骤:
- 构建
HttpClient实例(通常复用,它是线程安全的) - 构造
HttpRequest,指定 URL、方法、头、请求体等 - 调用
client.send(request, HttpResponse.BodyHandlers.ofString())
示例:
立即学习“Java免费学习笔记(深入)”;
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get"))
.GET()
.header("User-Agent", "Java HttpClient")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode()); // 200
System.out.println(response.body()); // JSON 响应体
异步请求:用 CompletableFuture 非阻塞处理
异步调用不阻塞线程,返回 CompletableFuture<HttpResponse<T>>,可链式处理结果、异常或超时。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
注意:异步执行依赖 HttpClient 内部的默认 ExecutorService(ForkJoinPool),也可自定义。
示例:
立即学习“Java免费学习笔记(深入)”;
HttpClient client = HttpClient.newBuilder()
.executor(Executors.newCachedThreadPool()) // 可选:自定义线程池
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/delay/2"))
.GET()
.build();
// 异步发起请求
CompletableFuture<HttpResponse<String>> future = client
.sendAsync(request, HttpResponse.BodyHandlers.ofString());
// 响应处理(在异步线程中执行)
future.thenAccept(response -> {
System.out.println("Status: " + response.statusCode());
System.out.println("Body: " + response.body().substring(0, 50));
}).exceptionally(throwable -> {
System.err.println("Request failed: " + throwable.getMessage());
return null;
});
常见请求体与响应类型
发送 JSON 或表单数据、接收二进制流等,只需换用对应的 BodyHandler 和 BodyPublisher:
- JSON 请求体:
HttpRequest.BodyPublishers.ofString("{\"name\":\"Alice\"}") - 字节数组:
ofByteArray(bytes) - 文件上传:
ofFile(Paths.get("data.txt")) - 响应为字节流:
BodyHandlers.ofByteArray()或ofInputStream() - 流式响应(如大文件):
BodyHandlers.ofFile(Paths.get("out.bin"))
超时与错误处理要点
超时需分别设置连接、请求级别;异常需区分网络异常、HTTP 状态码异常:
- 连接超时通过
HttpClient.Builder.connectTimeout()设置 - 整个请求超时用
HttpRequest.Builder.timeout() - 同步请求中,4xx/5xx 不抛异常,需手动检查
response.statusCode() - 网络失败(如 DNS 错误、连接拒绝)会抛
IOException;超时抛InterruptedException或IOException - 异步中这些异常会进入
exceptionally()或handle()回调

















