RestClient功能介绍
RestClient是Spring Framework 6.1版本引入的同步HTTP客户端,旨在替代老旧的RestTemplate
,提供更现代、流畅的API设计。其核心特点包括:
-
流畅API(Fluent API):
支持链式调用,通过方法链接实现自然语言风格的代码,可读性更强[1][4]。RestClient.builder().baseUrl("https://example.com").defaultHeader("My-Header", "Foo").build();
-
同步阻塞式通信:
与RestTemplate
类似,RestClient是同步客户端,适用于简单或低并发场景[1][4]。 -
高度可定制:
支持通过builder
配置请求工厂、默认Header、拦截器、消息转换器等[1][7][9]。 -
异常处理:
默认对4xx/5xx状态码抛出异常,但可通过onStatus
自定义处理逻辑[1][4]。 -
兼容RestTemplate:
可直接从RestTemplate
实例创建RestClient,简化迁移[7]。
完整使用示例
1. 创建RestClient实例
RestClient customClient = RestClient.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()) // 使用Apache HTTP客户端.defaultHeader("My-Header", "Foo") // 全局默认Header.requestInterceptor(myCustomInterceptor) // 添加请求拦截器.build();
2. 发送GET请求
MyResponse response = customClient.get().uri(URI.create("https://developers.ascendcorp.com")) // 设置URL.header("Correlation", correlationId) // 动态添加Header.retrieve() // 获取响应.onStatus(HttpStatusCode::is4xxClientError, (req, res) -> { // 处理4xx错误throw new MyCustomRuntimeException(res.statusCode(), res.headers());}).body(MyResponse.class); // 反序列化响应体
3. 发送POST请求
MyResponse response = customClient.post().uri(URI.create("https://developers.ascendcorp.com")) // 设置URL.body(request) // 设置请求体(自动序列化JSON).header("my-header-a", headerA) // 动态添加Header.header("my-header-b", headerB).retrieve().toEntity(MyResponse.class) // 获取响应实体.getBody();
4. 复杂响应处理(使用exchange
)
List<Article> articles = customClient.get().uri("/articles").exchange((request, response) -> {if (response.getStatusCode().is204()) {throw new ArticleNotFoundException();} else if (response.getStatusCode().is200()) {return objectMapper.readValue(response.getBody(), new TypeReference<>() {});} else {throw new InvalidArticleResponseException();}});
与RestTemplate、WebClient对比
特性 | RestClient | RestTemplate | WebClient |
---|---|---|---|
API风格 | 流畅链式调用(Fluent API) | 模板方法(重载方法多,复杂度高) | 函数式、链式调用(响应式编程) |
同步/异步 | 同步阻塞 | 同步阻塞 | 非阻塞、异步(基于Reactor) |
适用场景 | 新项目优先,需现代API设计 | 现有项目维护,简单同步需求 | 高并发、响应式场景(如WebFlux) |
性能 | 与RestTemplate相当(同步模型) | 较低(同步阻塞) | 高(非阻塞I/O,资源消耗低) |
异常处理 | 支持自定义状态处理器(onStatus ) | 需手动处理异常或使用ResponseErrorHandler | 响应式错误处理(Mono/Flux) |
依赖 | Spring Framework 6.1+ | Spring 3+ | Spring WebFlux(响应式环境) |
总结
-
RestClient:
- 适用于新项目,尤其是Spring 6.1+环境,提供现代化API设计和同步操作。
- 优势在于代码简洁、可读性强,且兼容
RestTemplate
的配置。
-
RestTemplate:
- 适合旧项目维护或简单同步需求,但API复杂度高,建议逐步迁移至RestClient。
-
WebClient:
- 高并发、响应式场景(如WebFlux)下的首选,支持非阻塞I/O和流式处理,但学习曲线较陡[3][9]。
选择建议:
- 新项目优先使用RestClient,淘汰
RestTemplate
。 - 高并发或响应式架构选择WebClient。
- 现有简单项目可继续使用
RestTemplate
,但不建议长期维护。