RestClient
是 Spring Framework 6 引入的一个现代化、流式、类型安全的 HTTP 客户端,在 Spring Boot 3.2+ 中可用。它旨在替代较旧的 RestTemplate
,更好地适应现代 HTTP 使用模式,并提供更简洁、直观的 API。
🔍 什么是 RestClient
?
RestClient
是构建在 Spring 的 WebClient
之上的新抽象,但它提供了简化的流式 API——非常适合阻塞式、同步的 HTTP 调用。可以将其视为现代化的 RestTemplate
。
RestClient 的主要优势
✅ 流式 API 更清晰、更易读的代码
✅ 内置 JSON(反)序列化 无需手动使用 ObjectMapper
✅ 异常处理 与 RestClientException
集成
✅ 类型安全的响应 直接将响应映射到 DTO
✅ 复用底层 WebClient 共享连接池和资源
✅ 更容易测试 与 MockRestServiceServer
配合良好
🔧 基本设置
确保你使用的是 Spring Boot 3.2+。
Bean 定义示例(可选)
@Bean
RestClient restClient(RestClient.Builder builder) {
return builder
.baseUrl("https://api.example.com")
.build();
}
基本用法
User user = restClient.get()
.uri("/users/{id}", 1)
.retrieve()
.body(User.class);
🎯 使用场景
1. GET 请求
User user = restClient.get()
.uri("/users/{id}", 101)
.retrieve()
.body(User.class);
2. POST 请求
User newUser = new User("Arjun", "arjun@bharat.in");
User created = restClient.post()
.uri("/users")
.body(newUser)
.retrieve()
.body(User.class);
3. PUT 请求
User updated = restClient.put()
.uri("/users/{id}", 101)
.body(updatedUser)
.retrieve()
.body(User.class);
4. DELETE 请求
restClient.delete()
.uri("/users/{id}", 101)
.retrieve();
5. 使用 ResponseEntity 和 Headers 进行交换
ResponseEntity<User> response = restClient.get()
.uri("/users/{id}", 101)
.retrieve()
.toEntity(User.class);
HttpHeaders headers = response.getHeaders();
🔐 认证和请求头
添加请求头
restClient.get()
.uri("/users")
.header("X-Custom-Header", "value")
.retrieve()
.body(User[].class);
添加 Bearer Token
restClient.get()
.uri("/secure")
.headers(headers -> headers.setBearerAuth("token123"))
.retrieve()
.body(SecureData.class);
📦 处理 JSON 数组和泛型类型
List<User> users = restClient.get()
.uri("/users")
.retrieve()
.body(new ParameterizedTypeReference<List<User>>() {});
⚠️ 错误处理
你可以使用 .onStatus(...)
处理 HTTP 错误
restClient.get()
.uri("/users/999")
.retrieve((request, response) -> {
if (response.getStatusCode().is4xxClientError()) {
throw new UserNotFoundException();
}
return response.body(User.class);
});
🧪 单元测试
使用 MockRestServiceServer
进行测试:
MockRestServiceServer mockServer = MockRestServiceServer.bindTo(restClient).build();
支持流式期望和验证。
🔁 重试和超时(Spring Retry + WebClient 自定义)
如果需要重试或超时:
- • 配置 RestClient 使用的底层 WebClient。
- • 可以通过注解或编程方式集成 Spring Retry。
🏁 何时使用 RestClient
✅ 在以下情况使用:
- • 需要简洁的同步 HTTP 调用
- • 不想处理响应式编程
- • 正在构建现代化的 Spring Boot 3.2+ 应用
- • 需要可测试性和可读性
❌ 在以下情况避免使用:
- • 需要高并发或非阻塞 I/O
- • 已经深入使用响应式流(继续使用 WebClient)
没有回复内容