首頁 > 軟體

SpringBoot 3.0 新特性內建宣告式HTTP使用者端範例詳解

2022-12-03 14:01:26

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 一個可支援企業各業務系統或產品快速開發實現的開源微服務應用開發平臺

到此這篇關於SpringBoot 3.0 新特性,內建宣告式HTTP使用者端的文章就介紹到這了,更多相關SpringBoot 宣告式HTTP使用者端內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com