从 Spring 6 和 Spring Boot 3 开始,Spring 框架支持将远程 HTTP 服务代理成带有特定注解的 Java http interface。类似的库,如 OpenFeign 和 Retrofit 仍然可以使用,但 http interface 为 Spring 框架添加内置支持。
声明式 http 客户端主旨是使得编写 java http 客户端更容易。为了贯彻这个理念,采用了通过处理注解来自动生成请求的方式(官方称呼为声明式、模板化)。通过声明式 http 客户端实现我们就可以在 java 中像调用一个本地方法一样完成一次 http 请求,大大减少了编码成本,同时提高了代码可读性。
- public interface TenantClient {
-
- @GetExchange("/tenants")
- Flux
getAll(); - }
- 复制代码
Spring 会在运行时提供接口的调用的具体实现,如上请求我们可以如 Java 方法一样调用
-
- @Autowired
- TenantClient tenantClient;
-
- tenantClient.getAll().subscribe(
-
- );
- 复制代码
- <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
@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.
- 复制代码
- @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);
- }
- 复制代码
-
- @SpringBootTest
- class DemoApplicationTests {
- @Autowired
- private DemoApi demoApi;
-
- @Test
- void testDemoApi() {
- demoApi.list();
- }