• SpringBoot 3.0 新特性,内置声明式 HTTP 客户端


    http interface

    从 Spring 6 和 Spring Boot 3 开始,Spring 框架支持将远程 HTTP 服务代理成带有特定注解的 Java http interface。类似的库,如 OpenFeign 和 Retrofit 仍然可以使用,但 http interface 为 Spring 框架添加内置支持。

    什么是声明式客户端

    声明式 http 客户端主旨是使得编写 java http 客户端更容易。为了贯彻这个理念,采用了通过处理注解来自动生成请求的方式(官方称呼为声明式、模板化)。通过声明式 http 客户端实现我们就可以在 java 中像调用一个本地方法一样完成一次 http 请求,大大减少了编码成本,同时提高了代码可读性。

    • 举个例子,如果想调用 /tenants 的接口,只需要定义如下的接口类即可
    1. public interface TenantClient {
    2. @GetExchange("/tenants")
    3. Flux getAll();
    4. }
    5. 复制代码

    Spring 会在运行时提供接口的调用的具体实现,如上请求我们可以如 Java 方法一样调用

    1. @Autowired
    2. TenantClient tenantClient;
    3. tenantClient.getAll().subscribe(
    4. );
    5. 复制代码

    测试使用

    1. maven 依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-web</artifactId>
    4. </dependency>
    5. <!-- For webclient support -->
    6. <dependency>
    7. <groupId>org.springframework.boot</groupId>
    8. <artifactId>spring-boot-starter-webflux</artifactId>
    9. </dependency>
    10. 复制代码

    如下图: 目前官方只提供了非阻塞 webclient 的 http interface 实现,所以依赖中我们需要添加 webflux

    2. 创建 Http interface 类型

    • 需要再接口类上添加 @HttpExchange 声明此类事 http interface 端点
    1. @HttpExchange
    2. public interface DemoApi {
    3. @GetExchange("/admin/tenant/list")
    4. String list();
    5. 复制代码
    • 方法上支持如下注解
    1. @GetExchange: for HTTP GET requests.
    2. @PostExchange: for HTTP POST requests.
    3. @PutExchange: for HTTP PUT requests.
    4. @DeleteExchange: for HTTP DELETE requests.
    5. @PatchExchange: for HTTP PATCH requests.
    6. 复制代码
    • 方法参数支持的注解
    1. @PathVariable: 占位符参数.
    2. @RequestBody: 请求body.
    3. @RequestParam: 请求参数.
    4. @RequestHeader: 请求头.
    5. @RequestPart: 表单请求.
    6. @CookieValue: 请求cookie.
    7. 复制代码

    2. 注入声明式客户端

    • 通过给 HttpServiceProxyFactory 注入携带目标接口 baseUrl 的的 webclient,实现 webclient 和 http interface 的关联
    1. @Bean
    2. DemoApi demoApi() {
    3. WebClient client = WebClient.builder().baseUrl("http://pigx.pigx.vip/").build();
    4. HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
    5. return factory.createClient(DemoApi.class);
    6. }
    7. 复制代码

    3. 单元测试调用 http interface

    1. @SpringBootTest
    2. class DemoApplicationTests {
    3. @Autowired
    4. private DemoApi demoApi;
    5. @Test
    6. void testDemoApi() {
    7. demoApi.list();
    8. }

  • 相关阅读:
    PMP项目管理中的各种图
    ssm租房小程序-计算机毕设 附源码42196
    rust学习
    正版授权 知名专业数据备份和数据同步软件工具 - GoodSync
    使用EasyExcel后端导出excel
    【MySQL】 MySQL的内置函数——日期函数、字符串函数、数学函数、聚合函数、其他函数
    japi项目需求分析阶段
    计算机系统(13)----- 进程的调度和切换
    FL STUDIO21正式版升级换代更新
    硬件接口和软件接口
  • 原文地址:https://blog.csdn.net/BASK2311/article/details/128145349