Spring Boot 3.2: 如何用RestClient替换传统的RestTemplate

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 请求的流程。

开发人员在与外部 API 交互时,可以享受到提高的生产力和更清晰的代码。强烈推荐从 RestTemplate 迁移到 RestClient,以获得一个更高效和具备未来性的代码库。文章来源地址https://www.toymoban.com/diary/system/715.html

到此这篇关于Spring Boot 3.2: 如何用RestClient替换传统的RestTemplate的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/system/715.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
分布式任务同步:在Spring中利用ShedLock
上一篇 2024年02月20日 16:41
Python函数管道示例和创建函数管道的好处
下一篇 2024年02月20日 17:11

相关文章

  • spring boot 3.2 使用restClient忽略ssl

    2024年02月20日
    浏览(25)
  • Spring Boot 3.2 + CRaC = 王炸!

    原文:https://foojay.io/today/springboot-3-2-crac/ 前段时间发布了 Spring 6.1 和 SpringBoot 3.2,它们都完全支持 CRaC(检查点协调恢复)。 如果你想了解有关 CRaC 的更多信息,请随时阅读此处: https://docs.azul.com/core/crac/crac-introduction CRaC 是一个 OpenJDK 项目,可以“快照”正在运行的 JVM(

    2024年02月04日
    浏览(23)
  • Spring Boot 3.2 新特性之 HTTP Interface

    SpringBoot 3.2引入了新的 HTTP interface 用于http接口调用,采用了类似 openfeign 的风格。 具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-http-interface HTTP Interface 是一个类似于 openfeign 的同步接口调用方法,采用 Java interfaces 声明远程接口调用的方法,理念上类

    2024年02月02日
    浏览(24)
  • Spring Boot 2.x 到 3.2 的全面升级指南

    Spring Framework 是一种流行的开源企业级框架,用于创建在 Java Virtual Machine (JVM) 上运行的独立、生产级应用程序。而Spring Boot 是一个工具,可以让使用 Spring 框架更快、更轻松地开发 Web 应用程序和微服务。随着 Spring Boot 的不断发展,开发人员必须跟上最新的升级和变化。 最近

    2024年02月04日
    浏览(26)
  • Spring Boot 3.2项目中使用缓存Cache的正确姿势!!!

    你是否曾想过为什么在 Spring Boot 应用中缓存是如此重要?答案在于它通过减少数据检索时间来提高性能。在本文中,我们将深入探讨缓存对微服务模式的影响,并探讨根据操作易用性、速度、可用性和可观测性等因素选择正确缓存的重要性。我们还将探讨如何最大程度地提高

    2024年02月05日
    浏览(29)
  • 用Spring Boot 3.2虚拟线程搭建静态文件服务器有多快?

    Spring Boot 3.2 于 2023 年 11 月大张旗鼓地发布,标志着 Java 开发领域的一个关键时刻。这一突破性的版本引入了一系列革命性的功能,包括: 虚拟线程:利用 Project Loom 的虚拟线程释放可扩展性,从而减少资源消耗并增强并发性。 Native Image支持:通过Native Image编译制作速度极快

    2024年02月03日
    浏览(25)
  • Spring Boot 3.2发布:大量Java 21的支持上线,改进可观测性

    就在今天凌晨,Spring Boot 3.2正式发布了!该版本是在Java 21正式发布之后的重要支持版本,所以在该版本中包含大量对Java 21支持的优化。 下面,我们分别通过Spring官方发布的博文和Josh Long长达80+分钟的介绍视频,一起认识一下Spring Boot 3.2最新版本所带来的全新内容。 官方博文

    2024年02月05日
    浏览(24)
  • 如何替换spring boot中spring框架的版本

    我开源的一个项目中,有朋友提到存在Spring Framework 身份认证绕过漏洞(CVE-2023-20860)。 解决方案是升级spring 框架版本: Spring Framework 5.3.X 系列用户建议升级Spring Framework到5.3.26及以上安全版本修复该漏洞 Spring Framework 6.0.X 系列用户建议升级Spring Framework到6.0.7及以上安全版本修复

    2024年02月11日
    浏览(23)
  • Spring Boot 升级 3.2 报错 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String

    🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正! youlai-boot 升级 Spring Boot 3.2 版本项目启动报错: 报错截图如下: mybatis-spring 官方 ISSUE: https://githu

    2024年02月03日
    浏览(21)
  • Spring Boot进阶(68):如何用SpringBoot轻松实现定时任务?集成Quartz来帮你!(附源码)

            Quartz是一个非常流行的开源调度框架,它提供了许多强大的功能,如定时任务调度、作业管理、任务持久化等。而SpringBoot是目前Java开发中非常流行的框架之一,其对各种开源框架集成非常方便。本篇文章将介绍如何在SpringBoot中集成Quartz,以便于更好的管理和调度

    2024年02月07日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包