Spring Boot 3.2, RestClient, RestTemplate, WebClient, HTTP请求, RESTful服务, 异步通信, 响应式原则
在 Spring Boot 的世界中,向外部服务发起 HTTP 请求是一个常见的任务。传统上,开发人员依赖于 RestTemplate 来实现这一目的。然而,随着 Spring 框架的演进,出现了一种处理 HTTP 请求的全新、更强大的方式:WebClient。在 Spring Boot 3.2 中,引入了一个名为 RestClient 的新功能,它基于 WebClient 构建,提供了一种更直观、现代化的方式来消费 RESTful 服务。
RestTemplate 的起源
多年来,RestTemplate 一直是 Spring 生态系统中的重要组成部分。它是一个同步客户端,用于发起 HTTP 请求和处理响应。借助 RestTemplate,开发人员可以轻松使用熟悉的 Java 语法与 RESTful API 进行交互。然而,随着应用程序变得越来越异步和非阻塞,RestTemplate 的局限性开始显现出来。
以下是使用 RestTemplate 从外部 API 获取数据的基本示例:
var restTemplate = new RestTemplate(); var response = restTemplate.getForObject("https://api.example.com/data", String.class); System.out.println(response);
WebClient 的引入
随着 Spring WebFlux 的出现,一种异步、非阻塞的网络框架,WebClient 被作为 RestTemplate 的现代替代品引入。WebClient 掌握了响应式原则,非常适合构建响应式应用程序。它支持同步和异步通信,并提供了流畅的 API 用于构建请求。
以下是您如何使用 WebClient 实现相同的 HTTP 请求:
var webClient = WebClient.create(); var response = webClient.get() .uri("https://api.example.com/data") .retrieve() .bodyToMono(String.class); response.subscribe(System.out::println);
Spring Boot 3.2 中的 RestClient
Spring Boot 3.2 带来了 RestClient,它是建立在 WebClient 之上的更高级抽象。RestClient通过提供更直观的流畅 API 并减少样板代码,进一步简化了发起 HTTP 请求的过程。它保留了 WebClient 的所有功能,同时提供了更加面向开发人员的接口。
让我们看一下如何使用 RestClient:
var response = restClient .get() .uri(cepURL) .retrieve() .toEntity(String.class); System.out.println(response.getBody());
通过 RestClient,代码变得更加简洁易读。RestClient 在内部处理 WebClient 实例的创建,将设置和管理 HTTP 客户端的复杂性抽象化。
比较 RestClient 与 RestTemplate
让我们通过查看一些常见情景来比较 RestClient 和 RestTemplate:
创建
RestTemplate:
var response = new RestTemplate();
RestClient:
var response = RestClient.create();
或者我们也可以继续使用旧的 RestTemplate:
var myOldRestTemplate = new RestTemplate(); var response = RestClient.builder(myOldRestTemplate);
GET 请求
RestTemplate:
var response = restTemplate.getForObject("https://api.example.com/data", String.class);
RestClient:
var response = restClient .get() .uri(cepURL) .retrieve() .toEntity(String.class);
POST 请求
RestTemplate:
ResponseEntity<String> response = restTemplate.postForEntity("https://api.example.com/data", request, String.class);
RestClient:
var response = restClient .post() .uri("https://api.example.com/data") .body(request) .retrieve() .toEntity(String.class);
错误处理
RestTemplate:
try { String response = restTemplate.getForObject("https://api.example.com/data", String.class); } catch (RestClientException ex) { // 处理异常 }
RestClient:
String request = restClient.get() .uri("https://api.example.com/this-url-does-not-exist") .retrieve() .onStatus(HttpStatusCode::is4xxClientError, (request, response) -> { throw new MyCustomRuntimeException(response.getStatusCode(), response.getHeaders()) }) .body(String.class);
从这些示例中可以看出,与 RestTemplate 相比,RestClient 提供了一种更简洁的方法来发起 HTTP 请求。
Spring 文档为我们提供了许多其他示例。
结论
在 Spring Boot 3.2 中,RestClient 出现作为 RestTemplate 的现代替代品,提供了一种更直观、更简洁的方式来消费 RESTful 服务。建立在 WebClient 之上,RestClient 掌握了响应式原则,同时简化了发起 HTTP 请求的流程。文章来源:https://www.toymoban.com/article/715.html
开发人员在与外部 API 交互时,可以享受到提高的生产力和更清晰的代码。强烈推荐从 RestTemplate 迁移到 RestClient,以获得一个更高效和具备未来性的代码库。文章来源地址https://www.toymoban.com/article/715.html
到此这篇关于Spring Boot 3.2: 如何用RestClient替换传统的RestTemplate的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!