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


猜你喜欢
- 本文涉及3个基本点:1、因为很多公司的内网都设有代理,浏览器通过ip与port上网,而java代码模拟http get方式同样需要外网代理;
- 本文实例讲述了Java高级特性之反射机制。分享给大家供大家参考,具体如下:老规矩我们还是先提出几个问题,一门技术必然要能解决一定的问题,才有
- 调用API设置鼠标位置并模拟鼠标右键让人物走动,全局钩子等using System;using System.Collections.Ge
- java 多线程的几种实现方法总结1.多线程有几种实现方法?同步有几种实现方法?多线程有两种实现方法,分别是继承Thread类与实现Runn
- 简单来说抽象类通常用来作为一个类族的最顶端的父类,用最底层的类表示现实中的具体事物,用最顶层的类表示该类族所有事物的共性。用abstract
- 1. Easy Rules 概述Easy Rules是一个Java规则引擎,灵感来自一篇名为《Should I use a Rules En
- 在Java中,可以通过Runtime类或ProcessBuilder类来实现调用外部程序。Runtime类与ProcessBuilder类使
- 1. Spring Boot Condition功能与作用@Conditional是基于条件的自动化配置注解, 由Spring 4框架推出的
- 情况一:问题idea项目突然无法运行,提示找不到某个类。查看了编译输出目录out,发现没有class文件。尝试解决尝试删除out、重新导入项
- 方法一、使用系统控件ViewFlipper方式:布局文件:<ViewFlipper andro
- 不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件!只需要简单易懂的Me
- 1.对象序列化的介绍(1).NET支持对象序列化的几种方式二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来
- 1.背景在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final s
- 1.项目简绍本项目使用SpringBoot开发,jdbc5.1.48 Mybatis 源码可下载其中涉及功能有:Mybatis的使用,Thy
- 缓存可以说是加速服务响应速度的一种非常有效并且简单的方式。在缓存领域,有很多知名的框架,如EhCache 、Guava、HazelCast等
- 在使用ListView组件来显示列表数据时,有的时候我们需要改变列表中的数据,有以下方法:1、重新给ListView组件设置适配器这种方法重
- using Microsoft.Win32 ; 1.读取指定名称的注册表的值 &nbs
- 先给大家简单介绍下mybatisMyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的J
- delphi dll 源码:library dllres; type char1
- Android ActionBarActivity设置全屏无标题的方法总结新建的Activity继承自ActionBarActivity,设