http interface
從 Spring 6 和 Spring Boot 3 開(kāi)始,Spring 框架支持將遠(yuǎn)程 HTTP 服務(wù)代理成帶有特定注解的 Java http interface懦底。類(lèi)似的庫(kù)唇牧,如 OpenFeign 和 Retrofit 仍然可以使用,但 http interface 為 Spring 框架添加內(nèi)置支持聚唐。
什么是聲明式客戶(hù)端
聲明式 http 客戶(hù)端主旨是使得編寫(xiě) java http 客戶(hù)端更容易丐重。為了貫徹這個(gè)理念,采用了通過(guò)處理注解來(lái)自動(dòng)生成請(qǐng)求的方式(官方稱(chēng)呼為聲明式杆查、模板化)扮惦。通過(guò)聲明式 http 客戶(hù)端實(shí)現(xiàn)我們就可以在 java 中像調(diào)用一個(gè)本地方法一樣完成一次 http 請(qǐng)求,大大減少了編碼成本亲桦,同時(shí)提高了代碼可讀性崖蜜。
- 舉個(gè)例子,如果想調(diào)用 /tenants 的接口烙肺,只需要定義如下的接口類(lèi)即可
public interface TenantClient {
@GetExchange("/tenants")
Flux<User> getAll();
}
Spring 會(huì)在運(yùn)行時(shí)提供接口的調(diào)用的具體實(shí)現(xiàn)纳猪,如上請(qǐng)求我們可以如 Java 方法一樣調(diào)用
@Autowired
TenantClient tenantClient;
tenantClient.getAll().subscribe(
);
測(cè)試使用
1. maven 依賴(lài)
<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 實(shí)現(xiàn),所以依賴(lài)中我們需要添加 webflux
2. 創(chuàng)建 Http interface 類(lèi)型
- 需要再接口類(lèi)上添加
@HttpExchange
聲明此類(lèi)事 http interface 端點(diǎn)
@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.
- 方法參數(shù)支持的注解
@PathVariable: 占位符參數(shù).
@RequestBody: 請(qǐng)求body.
@RequestParam: 請(qǐng)求參數(shù).
@RequestHeader: 請(qǐng)求頭.
@RequestPart: 表單請(qǐng)求.
@CookieValue: 請(qǐng)求cookie.
2. 注入聲明式客戶(hù)端
- 通過(guò)給 HttpServiceProxyFactory 注入攜帶目標(biāo)接口 baseUrl 的的 webclient桃笙,實(shí)現(xiàn) webclient 和 http interface 的關(guān)聯(lián)
@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. 單元測(cè)試調(diào)用 http interface
@SpringBootTest
class DemoApplicationTests {
@Autowired
private DemoApi demoApi;
@Test
void testDemoApi() {
demoApi.list();
}
}