SpringBoot 3.0 新特性内置声明式HTTP客户端实例详解
作者:mrr 时间:2022-11-25 13:47:20
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();
}
Spring 会在运行时提供接口的调用的具体实现,如上请求我们可以如 Java 方法一样调用
@Autowired
TenantClient tenantClient;
tenantClient.getAll().subscribe(
);
测试使用
1. maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- For webclient support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
如下图: 目前官方只提供了非阻塞 webclient 的 http interface 实现,所以依赖中我们需要添加 webflux
2. 创建 Http interface 类型
需要再接口类上添加 @HttpExchange
声明此类事 http interface 端点
@HttpExchange
public interface DemoApi {
@GetExchange("/admin/tenant/list")
String list();
方法上支持如 * 解
@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.
方法参数支持的注解
@PathVariable: 占位符参数.
@RequestBody: 请求body.
@RequestParam: 请求参数.
@RequestHeader: 请求头.
@RequestPart: 表单请求.
@CookieValue: 请求cookie.
3. 注入声明式客户端
通过给 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);
}
4. 单元测试调用 http interface
@SpringBootTest
class DemoApplicationTests {
@Autowired
private DemoApi demoApi;
@Test
void testDemoApi() {
demoApi.list();
}
}
基于Spring Boot 2.7、 Spring Cloud 2021 & Alibaba、 SAS OAuth2 一个可支持企业各业务系统或产品快速开发实现的开源微服务应用开发平台
来源:https://blog.csdn.net/qq_16063307/article/details/128129001
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Mybatis Plugin拦截器开发过程详解
Spring-IOC容器中的常用注解与使用方法详解
![](https://img.aspxhome.com/file/2023/6/122946_0s.png)
Android创建与解析XML(二)——详解Dom方式
![](https://img.aspxhome.com/file/2023/8/116028_0s.png)
Spring Boot启动banner定制的步骤详解
![](https://img.aspxhome.com/file/2023/6/97776_0s.png)
Java 实战练手项目之酒店管理系统的实现流程
![](https://img.aspxhome.com/file/2023/1/71201_0s.png)
C# 9.0新特性——只初始化设置器
java 实现文件复制和格式更改的实例
VS2022+unity3D开发环境搭建的实现步骤
![](https://img.aspxhome.com/file/2023/4/113894_0s.jpg)
Java超细致讲解数组的使用
![](https://img.aspxhome.com/file/2023/6/128826_0s.png)
详解如何将JAR包发布到Maven中央仓库
![](https://img.aspxhome.com/file/2023/9/84769_0s.png)
C#使用反射机制实现延迟绑定
Scala可变参数列表,命名参数和参数缺省详解
Unity动画混合树实例详解
![](https://img.aspxhome.com/file/2023/8/104298_0s.gif)
浅谈Android面向切面编程(AOP)
![](https://img.aspxhome.com/file/2023/3/137513_0s.png)
基于html5+java实现大文件上传实例代码
JAVA8之函数式编程Function接口用法
![](https://img.aspxhome.com/file/2023/6/63276_0s.jpg)
Java8如何从一个Stream中过滤null值
C语言代码实现三子棋小游戏
![](https://img.aspxhome.com/file/2023/6/112306_0s.jpg)
jdk15的安装与配置全过程记录
![](https://img.aspxhome.com/file/2023/6/85516_0s.jpg)