在最近发布的Spring 6.1 M2版本中,推出了一个全新的同步HTTP客户端:RestClient
。用一句话来让Spring开发者认识RestClient
的话:像WebClient
一样具备流畅API的RestTemplate
。所以,RestClient
的使命就是淘汰已经有14年历史的RestTemplate
。
关于WebClient
和RestTemplate
,之前在几种服务消费方式(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。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源
- RestTemplate RestClient 特性 Spring 6.1resttemplate restclient特性spring restclient spring6 spring 正式版framework spring 6.1 resttemplate springcloud spring ribbon multivaluemap resttemplate spring resttemplate spring resttemplate模板spring rest resttemplate spring feign 示例resttemplate spring boot 小结resttemplate spring