1. java.net.http.HttpClient(Java 标准库)

简介

  • 所属模块:Java 11+ 标准库(java.net.http 包),无需引入额外依赖。
  • 定位:通用的、低层级的 HTTP 客户端,支持同步与异步请求模式。
  • 核心特性

    • 原生支持 HTTP/1.1 和 HTTP/2 协议。
    • 提供同步(Blocking)和异步(Non-blocking)API。
    • 支持 WebSocket 通信。
    • 轻量级设计,无框架耦合。

核心用法示例

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

// 创建 HttpClient 实例
HttpClient client = HttpClient.newHttpClient();

// 同步 GET 请求
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com/users/1"))
    .header("Accept", "application/json")
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

// 异步 GET 请求
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);

适用场景

  • 非 Spring 项目,或希望减少第三方依赖的场景。
  • 需要直接控制 HTTP 协议细节(如强制使用 HTTP/2)。
  • 需要原生异步请求处理或 WebSocket 通信。

2. Spring RestClient

简介

  • 所属模块:Spring Framework 6.1+(spring-web 模块)。
  • 定位:面向 Spring 生态的同步 HTTP 客户端,旨在替代 RestTemplate
  • 核心特性

    • 提供链式调用(Fluent API),语法简洁直观。
    • 深度集成 Spring 功能(如消息转换器、拦截器、错误处理)。
    • 仅支持同步请求(异步场景建议使用 WebClient)。

核心用法示例

import org.springframework.web.client.RestClient;

// 创建 RestClient 实例
RestClient client = RestClient.builder()
    .baseUrl("https://api.example.com")
    .defaultHeader("Accept", "application/json")
    .build();

// 发起 GET 请求并自动反序列化
User user = client.get()
    .uri("/users/{id}", 1)
    .retrieve()
    .body(User.class);

适用场景

  • Spring 项目中的同步 HTTP 调用。
  • 需要与 Spring 组件(如 HttpMessageConverter、统一异常处理)深度集成。
  • 希望替代旧的 RestTemplate,追求更现代、类型安全的 API 设计。

3. 对比与关联

特性对比

特性java.net.http.HttpClientSpring RestClient
所属平台Java 标准库(JDK 11+)Spring Framework 6.1+
依赖成本无需额外依赖需引入 spring-web
请求模式同步 + 异步仅同步
API 设计链式构建,需手动处理响应体链式调用,支持自动反序列化
生态集成无框架耦合深度集成(消息转换器、拦截器等)
HTTP/2 支持原生支持依赖底层实现(可配置 JDK HttpClient)
典型场景通用、非 Spring 项目、异步/HTTP/2 需求Spring 项目、同步请求、简化开发

关联与协作

  1. 底层实现依赖

    • Spring RestClient 底层可适配多种 HTTP 库。虽然默认实现可能基于 HttpURLConnection,但支持配置为使用 JDK 17+ 的 HttpClient 作为底层传输实现。
    • 可通过 RestClient.builder().httpClient(...) 自定义底层客户端实例。
  2. 互补使用策略

    • 需要异步请求:在 Spring 项目中,优先使用响应式的 WebClient 而非 RestClient
    • 需要底层控制:直接使用 java.net.http.HttpClient 以获得更细粒度的协议控制。
    • 简化 Spring 集成:使用 RestClient 可直接绑定 Spring 容器中的组件,降低样板代码。

4. 选型建议

建议使用 HttpClient 的场景

  • 非 Spring 项目,或希望严格控制依赖体积。
  • 业务强依赖异步请求或 HTTP/2 特性。
  • 对性能调优或协议细节有严格要求。

建议使用 RestClient 的场景

  • 基于 Spring 框架的项目,主要进行同步 HTTP 调用。
  • 需要快速集成 Spring 功能(如自动 JSON 反序列化、统一错误处理)。
  • 计划替代 RestTemplate,追求更简洁、可测试的 API 设计。

5. 协作配置示例

在 Spring 中配置 RestClient 使用 JDK HttpClient

以下示例展示如何在 Spring 配置类中,显式指定 RestClient 使用 JDK 标准库的 HttpClient 作为底层实现:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestClient;
import java.net.http.HttpClient;

@Configuration
public class RestClientConfig {
    @Bean
    public RestClient restClient() {
        return RestClient.builder()
            .baseUrl("https://api.example.com")
            // 显式使用 JDK 17+ 的 HttpClient 作为底层实现
            .httpClient(HttpClient.newHttpClient())
            .build();
    }
}

总结

  • java.net.http.HttpClient:Java 标准库提供的通用 HTTP 工具,适合非 Spring 项目或对异步、HTTP/2 有明确需求的场景。
  • RestClient:Spring 生态推荐的同步客户端,语法简洁、集成度高,适合大多数 Spring 业务开发。
  • 协作关系:二者并非互斥,RestClient 可基于 JDK 的 HttpClient 实现底层通信,在 Spring 项目中可结合使用以兼顾开发效率与底层控制。
说明:本文内容基于 Java 11+ 及 Spring Framework 6.1+ 版本特性。具体默认行为可能因 Spring Boot 自动配置版本不同而略有差异,建议以实际项目依赖为准。