推荐使用JDK 11+内置HttpClient,线程安全建议复用实例;支持同步send和异步sendAsync;需校验statusCode、响应体仅可读一次;JSON请求需手动序列化并设Content-Type;适合绝大多数REST场景。

Java中执行REST请求,推荐使用JDK 11+内置的HttpClient(java.net.http.HttpClient),它取代了已弃用的Apache HttpClient和HttpURLConnection,是现代、异步、响应式且标准统一的HTTP客户端方案。
创建HttpClient实例
HttpClient是线程安全的,建议复用单个实例(如通过static final或依赖注入):
// 推荐:复用实例,支持连接池与超时配置
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
构造并发送GET/POST等REST请求
使用HttpRequest.Builder构建请求,指定URL、方法、头信息和可选的请求体:
- GET请求:无需body,直接调用GET(),适合获取资源
- POST/PUT请求:需设置body,常用BodyPublishers(如ofString、ofByteArray、ofFile)
- JSON请求:手动序列化对象为字符串,并设置Content-Type: application/json
// 示例:POST JSON数据
String json = "{\"name\":\"Alice\",\"age\":30}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/users"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
同步与异步执行方式
HttpClient同时支持阻塞式(send)和非阻塞式(sendAsync)调用:
立即学习“Java免费学习笔记(深入)”;
- 同步:HttpResponse
response = client.send(request, HttpResponse.BodyHandlers.ofString()); - 异步:返回CompletableFuture,适合高并发场景,可链式处理(thenApply, exceptionHandler)
- BodyHandler选择灵活:ofString()、ofLines()、ofByteArray()、discarding()等按需选用
// 异步示例:处理成功与异常
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenAccept(resp -> System.out.println(resp.body()))
.exceptionally(t -> { System.err.println("请求失败: " + t); return null; });
处理响应与常见注意事项
响应包含状态码、头信息和body,需主动检查statusCode避免静默失败:
- 务必校验response.statusCode()是否为2xx,否则可能掩盖业务错误
- 响应体只能读取一次,重复调用body()会抛IllegalStateException
- 大文件下载建议用ofInputStream()配合流式处理,避免内存溢出
- 需要Cookie或重定向控制?通过CookieHandler或followRedirects()定制
基本上就这些。标准HttpClient简洁、可靠、无第三方依赖,适合绝大多数REST交互场景。










