从 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();
复制代码
org.springframework.boot spring-boot-starter-web
org.springframework.boot spring-boot-starter-webflux
复制代码
如下图: 目前官方只提供了非阻塞 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.
复制代码
@BeanDemoApi 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 {@Autowiredprivate DemoApi demoApi;@Testvoid testDemoApi() {demoApi.list();}