• 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 的接口,只需要定义如下的接口类即可
    public interface TenantClient {
    
      @GetExchange("/tenants")
      Flux<User> getAll();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    
    @Autowired
    TenantClient tenantClient;
    
    tenantClient.getAll().subscribe(
    
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试使用

    1. maven 依赖

    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    
    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webfluxartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    2. 创建 Http interface 类型

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

    2. 注入声明式客户端

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

    3. 单元测试调用 http interface

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

    基于Spring Boot 2.7、 Spring Cloud 2021 & Alibaba、 SAS OAuth2 一个可支持企业各业务系统或产品快速开发实现的开源微服务应用开发平台

  • 相关阅读:
    【前端精进之路】JS篇:第6期 变量提升和函数提升
    设计模式7、桥接模式 Bridge
    Neoj4 cypher脚本基本操作
    TCP 小结
    FutureTask的测试使用和方法执行分析
    计算Java对象大小
    有效的字母异位词(哈希表)
    【网络】网络基础&&套接字编程详解
    万字长文带你学习ElasticSearch
    AI & Web3 盛会「EDGE」在港闭幕,融云国际影响力持续提升
  • 原文地址:https://blog.csdn.net/qq_16063307/article/details/128129001