再見RestTemplate,Spring 6.1新特性:RestClient 瞭解一下!

2023-07-18 06:00:22

在最近釋出的Spring 6.1 M2版本中,推出了一個全新的同步HTTP使用者端:RestClient。用一句話來讓Spring開發者認識RestClient的話:像WebClient一樣具備流暢API的RestTemplate。所以,RestClient的使命就是淘汰已經有14年曆史的RestTemplate

關於WebClientRestTemplate,之前在幾種服務消費方式(RestTemplate、WebClient、Feign)這篇文章中有詳細的介紹。如果您有一定的瞭解,那麼對於RestClient一定可以快速上手。

RestClient案例

下面我們通過幾個官方給出的案例一起來快速的認識一下RestClient

HTTP請求

下面是一個最簡單的GET請求,返回一個字串。從這個例子中,我們可以看到API形式跟WebClient類似。不像以前用RestTemplate的時候那麼麻煩。

RestClient restClient = RestClient.create();

String result = restClient.get()
  .uri("https://example.com")
  .retrieve()
  .body(String.class);
System.out.println(result);

關於GET請求,很多時候我們返回的不僅僅是String,更多的時候是一些實體;同時我們有時候還需要獲取HTTP狀態碼以及頭資訊。這個時候,我們可以使用toEntity方法來返回一個更為通用的ResponseEntity來進行後續操作,比如下面這樣:

ResponseEntity<String> result = restClient.get()
  .uri("https://example.com")
  .retrieve()
  .toEntity(String.class);

System.out.println("Response status: " + result.getStatusCode());
System.out.println("Response headers: " + result.getHeaders());
System.out.println("Contents: " + result.getBody());

在業務層面,為了更方便的解析業務資料。RestClient還支援對結果進行物件轉換。比如下面的例子,就是把HTTP請求返回的JSON資料轉化為Pet物件。這樣就免去了開發者手動從ResponseEntity中獲取內容,再進行訊息轉化的麻煩。

int id = ...
Pet pet = restClient.get()
  .uri("https://petclinic.example.com/pets/{id}", id)
  .accept(APPLICATION_JSON)
  .retrieve()
  .body(Pet.class);

關於其他請求,也是類似的,比如下面的POST請求:

Pet pet = ...
ResponseEntity<Void> response = restClient.post()
  .uri("https://petclinic.example.com/pets/new")
  .contentType(APPLICATION_JSON)
  .body(pet)
  .retrieve()
  .toBodilessEntity();

錯誤處理

預設情況下,RestClient在接收到4xx和5xx狀態碼的時候,會丟擲一個RestClientException的子類。對於這個動作,我們可以通過onStatus方法去重寫它,比如下面這樣:

String result = restClient.get()
  .uri("https://example.com/this-url-does-not-exist")
  .retrieve()
  .onStatus(HttpStatusCode::is4xxClientError, (request, response) -> {
      throw new MyCustomRuntimeException(response.getStatusCode(), response.getHeaders())
  })
  .body(String.class);

上面的例子是進一步做了包裝,並重新丟擲。當然您也可以做一些業務性的其他操作。

高階處理 Exchange

直接看下面的例子:

Pet result = restClient.get()
  .uri("https://petclinic.example.com/pets/{id}", id)
  .accept(APPLICATION_JSON)
  .exchange((request, response) -> {
    if (response.getStatusCode().is4xxClientError()) {
      throw new MyCustomRuntimeException(response.getStatusCode(), response.getHeaders());
    }
    else {
      Pet pet = convertResponse(response);
      return pet;
    }
  });

exchange方法提供了更靈活且完整的請求處理入口。在這裡,開發者裡獲取到request資訊,也可以操作response資訊。所以,如果您有複雜的處理邏輯上一節中的請求方法無法滿足你需要的時候,就可以通過這裡的exchange方法來客製化複雜的處理邏輯。

小結

相信大家對RestTemplate一定都不陌生,但實際應用估計已經不是很多了,更多的會使用一些其他的使用者端來實現HTTP的呼叫。如今Spring 6.1將推出的RestClient將很好的彌補這塊不足,同時與WebClient互相補充。好了,今天的學習就到這裡!如果您學習過程中如遇困難?可以加入我們超高質量的Spring技術交流群,參與交流與討論,更好的學習與進步!更多Spring Boot教學可以點選直達!,歡迎收藏與轉發支援!

歡迎關注我的公眾號:程式猿DD。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源