Spring6.1新特性,四种方式调用REST接口(RestClient、WebClient、RestTemplate、HTTP Interface)

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


官网

REST Clients :: Spring Framework

The Spring Framework provides the following choices for making calls to REST endpoints:

  • RestClient - synchronous client with a fluent API.
  • WebClient - non-blocking, reactive client with fluent API.
  • RestTemplate - synchronous client with template method API.
  • HTTP Interface - annotated interface with generated, dynamic proxy implementation.

RestClient

官方描述:RestClient是一个同步HTTP客户端,它提供了一个现代、流畅的API。它提供了对HTTP库的抽象,允许从Java对象到HTTP请求的方便转换,以及从HTTP响应创建对象。

Spring6.1版本新特性。

创建

创建RestClient非常简单,可以使用静态create方法,也可以使用builder创建,其提供了非常丰富的定制化选项,请求工厂、消息转换器、拦截器、默认头、请求初始化器等等,简单易懂。

java 复制代码
RestClient defaultClient = RestClient.create();

RestClient customClient = RestClient.builder()
  .requestFactory(new HttpComponentsClientHttpRequestFactory())
  .messageConverters(converters -> converters.add(new MyCustomMessageConverter()))
  .baseUrl("https://example.com")
  .defaultUriVariables(Map.of("variable", "foo"))
  .defaultHeader("My-Header", "Foo")
  .requestInterceptor(myCustomInterceptor)
  .requestInitializer(myCustomInitializer)
  .build();

使用

使用RestClient更为简单,请求URLHeaderBody、相应Response接受、异常处理等等相当丰富简单。

java 复制代码
String result = customClient.get()
        .uri("https://example.com/this-url-does-not-exist")
        .retrieve()
        .onStatus((code) -> code.value() / 100 == 4, (request, response) -> {
            throw new RuntimeException(response.getStatusCode() + " " + response.getHeaders());
        })
        .body(String.class);

WebClient

WebClient是一个无阻塞、响应式的客户端,用于执行HTTP请求。它在5.0中引入,提供了RestTemplate的替代方案,支持同步、异步和流式传输场景。

早在Spring5版本中就已经出现,创建方法和RestClient差不多,简单示例如下,其他详细内容可参考官网可Java Doc

java 复制代码
WebClient webClient = WebClient.builder().baseUrl("http://localhost:8081").build();

RestTemplate

相比于上面两位这个更是古老,也正因此更为常见,使用的更多。但是官网明确表示,推荐使用RestClient替换RestTemplate,甚至还细心的整理了替换方案,可知官方可能计划着在未来彻底废弃RestTemplate,也许哦。

HTTP Interface

官方描述:Spring Framework允许您使用@HttpExchange方法将HTTP服务定义为Java接口。您可以将这样的接口传递给HttpServiceProxyFactory,以创建一个代理,该代理通过HTTP客户端(如RestClientWebClient)执行请求。您还可以从@Controller实现用于服务器请求处理的接口。

简单的来讲,可以类比为OpenFeign,使用方法是几乎一样的。

这个也是Spring6的特性,最开始官方支持了WebFlux的实现,后来才加入的RestClientRestTemplate,使用方式如上图。

方法级别的注解有下,是不是和使用OpenFeign时几乎一样了,其实不然,@RequestHeader@RequestBody@PathVariable@RequestParam@CookieValue等等也是支持的。

java 复制代码
@GetExchange
@PostExchange
@PutExchange
@DeleteExchange
@PatchExchange

小结

可以说在Spring6.1之后再进行REST调用就有更加丰富的选择了,而且更加简单方便。

写在最后

拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。


个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview

相关推荐
咖啡八杯1 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
掘金码甲哥2 小时前
这块终端神器, 必须吹爆!
后端
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
Csvn2 小时前
📊 SQL 入门 Day 8:集合操作 — 用 SQL 做数学里的"并交差"
后端·sql
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121315 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
码事漫谈5 小时前
告别数据孤岛与AI“水土不服”:金仓多模融合时序库如何让数据真正服务于业务
后端