KayV
KayV

Reputation: 13855

WebClient vs RestTemplate

As per spring 5:

WebClient is an interface representing the main entry point for performing web requests.

It has been created as a part of the Spring Web Reactive module and will be replacing the classic RestTemplate in these scenarios. The new client is a reactive, non-blocking solution that works over the HTTP/1.1 protocol

Does that mean, we need to recode for the old applications using RestTemplate if we want to upgrade to Spring 5?

Or there is some workaround to work with RestTemplate in Spring 5?

Upvotes: 97

Views: 109177

Answers (6)

pvpkiran
pvpkiran

Reputation: 27078

No, RestTemplate will continue to exist (at least for now). You don't have to replace it with WebClient.
One of the main differences is RestTemplate is synchronous and blocking i.e. when you do a rest call you need to wait till the response comes back to proceed further.

But WebClient is complete opposite of this. The caller need not wait till response comes back. Instead he will be notified when there is a response.

If you need such a functionality, then yes you need to replace your Resttemplate with WebClient.
You can in fact achieve Rest template like synchronous processing in webclient using .block(). But the other way is not possible.

EDIT:

RestTemplate is marked as feature complete in future version(> 5.0) and will not have new features added going forward

Upvotes: 126

Martin Tarjányi
Martin Tarjányi

Reputation: 9987

As per the announcement, from Spring 6.1 and Spring Boot 3.2 we have a brand new option called RestClient:

Spring Framework 6.1 M2 introduces the RestClient, a new synchronous HTTP client. As the name suggests, RestClient offers the fluent API of WebClient with the infrastructure of RestTemplate.

RestClient restClient = RestClient.create();

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

Based on the JavaDoc of RestTemplate, this is now the recommended replacement:

NOTE: As of 6.1, RestClient offers a more modern API for synchronous HTTP access.

The new RestClient can also be used with the recently introduced declarative HTTP interface without including Webflux on the classpath.

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);

Upvotes: 8

xiaohugod
xiaohugod

Reputation: 71

RestTemplate is not really deprecated. But it will not be evolved in the future. So sticking to RestTemplate is perfectly valid if it does what you need.

Another way to put that is that if you need specific usage patterns like streaming, scatter/gatter, or custom timeouts, this won't be covered by RestTemplate and you need to use WebClient instead.

Now using WebClient in a blocking application is fine too. Using block() shouldn't hurt there and Spring MVC controller does partially support reactive return types.

Upvotes: 7

Evgeni Dimitrov
Evgeni Dimitrov

Reputation: 22516

According to the Java Doc the RestTemplate will be in maintenance mode. Spring team advise to use the WebClient if possible:

NOTE: As of 5.0, the non-blocking, reactive org.springframework.web.reactive.client.WebClient offers a modern alternative to the RestTemplate with efficient support for both sync and async, as well as streaming scenarios. The RestTemplate will be deprecated in a future version and will not have major new features added going forward.

Upvotes: 59

ismael
ismael

Reputation: 474

WebClient is Non-Blocking Client, RestTemplate is Blocking Client.

For a long time, spring serves as a web customer. Under the hood, RestTemplate uses the Java API API, which is based on the subject model.This means that the matter will be blocked until the client receives a response. The problem with the blockage code is due to the existence of any string of memory and cpu cycles. Let us consider a lot of applications that are waiting for low services that are needed to produce the result.Sooner or later, requests for the results are collected. As a result, the program creates many issues, which result in depletion of a pool of thread or occupying all of the available memory. We can also experience performance performance due to the cpu switching.

Spring WebClient vs. RestTemplate

Upvotes: 5

Pritesh Ladhe
Pritesh Ladhe

Reputation: 81

WebClient supports asynchronous as well as synchronous calls. RestTemplate supports only synchronous calls. No changes are required in old code even if the RestTemplate is depracated(as long as you don't need asynchronous behaviour)

Upvotes: 3

Related Questions