WebClient与RestTemplate

Kay*_*ayV 31 spring reactive-programming web-client resttemplate

按照春季5:

WebClient是表示执行Web请求的主要入口点的接口.

它已作为Spring Web Reactive模块的一部分创建,并将在这些场景中替换经典的RestTemplate.新客户端是一种通过HTTP/1.1协议工作的反应式非阻塞解决方案

这是否意味着,如果我们想要升级到Spring 5,我们需要使用RestTemplate重新编码旧应用程序?

或者在Spring 5中使用RestTemplate有一些解决方法?

pvp*_*ran 37

不,RestTemplate将继续存在.您不必使用WebClient替换它.
其中一个主要区别是RestTemplate是同步和阻塞.即当你进行休息通话时,你需要等到响应回来继续进行.

但WebClient完全与此相反.呼叫者不必等到响应回来.相反,他会在有回复时得到通知.

如果您需要这样的功能,那么您需要使用WebClient替换Resttemplate.
你可以在webclient中实现Rest模板,如同步处理.block().但另一种方式是不可能的.

  • https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html这里说其他模板将被折旧在以后的版本中 (18认同)
  • Spring 5.0 文档表示 RestTemplate 将被弃用,但 Spring 5.2 软化了这一点,它表示维护模式。 (7认同)
  • 您能查一下最新情况吗?它说,它已被弃用 (2认同)

Evg*_*rov 32

根据Java Doc,RestTemplate将被弃用.Spring团队建议尽可能使用WebClient:

注意:从5.0开始,非阻塞,反应式org.springframework.web.reactive.client.WebClient提供了RestTemplate的现代替代方案,同时有效支持同步和异步以及流方案.RestTemplate将在未来版本中弃用,并且不会在未来添加主要的新功能.

  • 上面已经说过了,但他们不再称其为“已弃用”:“注意:从 5.0 开始,此类处于维护模式,只有少量的更改请求和错误将被接受。请考虑使用`org. springframework.web.reactive.client.WebClient` 具有更现代的 API,并支持同步、异步和流场景。” (2认同)

Mar*_*nyi 8

根据公告,从 Spring 6.1 和 Spring Boot 3.2 开始,我们有一个全新的选项,称为RestClient

Spring Framework 6.1 M2 引入了RestClient,一个新的同步 HTTP 客户端。顾名思义,RestClient 通过 RestTemplate 的基础设施提供 WebClient 的流畅 API。

RestClient restClient = RestClient.create();

String result = restClient.get()
  .uri("https://example.com")
  .retrieve()
  .body(String.class);
Run Code Online (Sandbox Code Playgroud)

根据 的JavaDoc RestTemplate现在推荐替换:

注意:从 6.1 开始,RestClient 为同步 HTTP 访问提供了更现代的 API。

新的 RestClient 还可以与最近引入的声明性 HTTP 接口一起使用,而无需在类路径中包含 Webflux。

RestClient restClient = RestClient.builder().baseUrl("https://api.github.com/").build();
RestClientAdapter adapter = RestClientAdapter.create(restClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();

RepositoryService service = factory.createClient(RepositoryService.class);
Run Code Online (Sandbox Code Playgroud)


小智 6

RestTemplate并没有真正被弃用。但以后不会再进化了。RestTemplate因此,如果它能满足您的需要,那么坚持是完全有效的。

另一种说法是,如果您需要特定的使用模式,例如流式传输、分散/聚集或自定义超时,则不会涵盖这些模式,RestTemplate您需要使用WebClient它。

现在在阻塞应用程序中使用WebClient也很好。使用block()应该不会有什么坏处,Spring MVC 控制器确实部分支持反应式返回类型。


ism*_*ael 5

WebClient 是非阻塞客户端,RestTemplate 是阻塞客户端。

长期以来,Spring 充当 Web 客户。在底层,RestTemplate使用 Java API API,该 API 基于主题模型。这意味着事务将被阻止,直到客户端收到响应。阻塞代码的问题是由于任意一串内存和CPU周期的存在造成的。让我们考虑许多正在等待生成结果所需的低服务的应用程序。迟早,对结果的请求会被收集。因此,程序会产生许多问题,导致线程池耗尽或占用所有可用内存。我们还可以体验到由于cpu切换带来的性能表现。

Spring WebClient 与 RestTemplate

  • “Java API API,它是基于主题模型的”——这对我来说毫无意义。需要一些修正吗?另外:“这件事将被阻止” - 你是指线程吗?其中有很多错误 - 我建议缩短或删除这个答案。 (2认同)