daicy
发布于 2025-03-15 / 5 阅读
0
0

Spring Framework 中 RestClient 的详细介绍及示例

以下是关于 Spring Framework 中 RestClient 的详细介绍及示例,适用于 Spring 6.1+ 版本:


什么是 RestClient

RestClient 是 Spring Framework 6.1 引入的一个同步 HTTP 客户端,旨在替代旧的 RestTemplate,提供更简洁、现代的 API 设计。它专注于同步请求场景,语法链式调用(Fluent API),并支持与 Spring 生态(如错误处理、拦截器等)无缝集成。


核心特性

  1. 同步请求:适合传统阻塞式调用。
  2. 链式调用:方法链式设计,代码更简洁。
  3. 灵活配置:支持自定义请求头、拦截器、错误处理等。
  4. 与 Spring 集成:可直接注入 Bean,或与 RestTemplate 的组件(如 HttpMessageConverter)复用。

依赖配置

确保使用 Spring Boot 3.2+ 或手动引入 spring-web 6.1+

<!-- Maven 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.2.0+</version>
</dependency>

快速使用示例

1. 创建 RestClient 实例

import org.springframework.web.client.RestClient;

// 基础配置
RestClient client = RestClient.builder()
    .baseUrl("https://api.example.com")  // 基础 URL
    .defaultHeader("Accept", "application/json")  // 默认请求头
    .build();

2. 发起 GET 请求

// 获取 JSON 响应并反序列化为对象
User user = client.get()
    .uri("/users/{id}", 1)  // 路径参数
    .retrieve()             // 发起请求
    .body(User.class);      // 反序列化为 User 对象

System.out.println(user.getName());

3. 发起 POST 请求

// 提交 JSON 数据
User newUser = new User("Alice", 30);
User createdUser = client.post()
    .uri("/users")
    .contentType(MediaType.APPLICATION_JSON)
    .body(newUser)          // 请求体
    .retrieve()
    .body(User.class);

4. 处理错误

// 自定义错误处理
client.get()
    .uri("/users/{id}", 999)
    .retrieve()
    .onStatus(status -> status.value() == 404, (req, res) -> {
        throw new UserNotFoundException("User not found");
    })
    .body(User.class);

高级功能

1. 添加拦截器

RestClient client = RestClient.builder()
    .baseUrl("https://api.example.com")
    .requestInterceptor((request, body, execution) -> {
        // 添加认证头
        request.getHeaders().set("Authorization", "Bearer token");
        return execution.execute(request, body);
    })
    .build();

2. 自定义消息转换器

RestClient client = RestClient.builder()
    .messageConverters(converters -> {
        converters.add(new MappingJackson2HttpMessageConverter());
        converters.add(new StringHttpMessageConverter());
    })
    .build();

3. 文件下载

client.get()
    .uri("/files/{name}", "report.pdf")
    .accept(MediaType.APPLICATION_PDF)
    .retrieve()
    .body(InputStreamResource.class);  // 获取文件流

与旧组件的对比

特性RestClient (6.1+)RestTemplate (旧)WebClient (响应式)
请求类型同步同步异步/非阻塞
API 设计链式调用传统方法调用链式调用 + Reactor
适用场景简单同步 HTTP 调用旧项目兼容响应式或复杂异步场景
依赖spring-webspring-webspring-webflux

总结

  • 推荐场景:在 Spring 6.1+ 项目中,优先使用 RestClient 替代 RestTemplate
  • 优势:语法简洁、易扩展、与 Spring 生态深度集成。
  • 注意:如果需要异步或响应式编程,继续使用 WebClient

评论