再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!
在最近发布的Spring 6.1 M2版本中,推出了一个全新的同步HTTP客户端:RestClient
。用一句话来让Spring开发者认识RestClient
的话:像WebClient
一样具备流畅API的RestTemplate
。
所以,RestClient
的使命就是淘汰已经有14年历史的RestTemplate
。
关于WebClient
和RestTemplate
,之前在几种服务消费方式(RestTemplate、WebClient、Feign)(https://blog.didispace.com/spring-cloud-alibaba-2/)这篇文章中有详细的介绍。如果您有一定的了解,那么对于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
互相补充。
推荐阅读
MySQL的“分库分表”思路可不能盲目应用到 Elasticsearch IntelliJ IDEA 新增 Kotlin Notebook 插件 Spring Boot自带的工具类,不要太好用,建议收藏!
你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。