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

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

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.

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);
    }

3. 单元测试调用 http interface


@SpringBootTest
class DemoApplicationTests {
	@Autowired
	private DemoApi demoApi;
	@Test
	void testDemoApi() {
		demoApi.list();
	}
}

基于Spring Boot 2.7、 Spring Cloud 2021 & Alibaba、 SAS OAuth2 一个可支撑企业各事务系统或产品快速开发完成的开源微服务使用开发渠道