在最近发布的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。第一时间了解前沿职业消息、分享深度技能干货、获取优质学习资源