在Java中如何利用HttpClient执行REST请求_Java现代HTTP客户端机制说明

推荐使用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)调用:

  • 同步: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交互场景。