3.8 External API Communication (RestTemplate, WebClient, RestClient)
Learn about the various HTTP client libraries available in Spring Boot for calling external services, including both synchronous and asynchronous processing methods.
1. RestTemplate (Traditional Approach)
RestTemplate has been the most popular Synchronous, Blocking HTTP client since Spring 3.0.
Characteristics
- The thread waits (blocks) until it receives a response for each call.
- Suitable for simple designs following RESTful principles.
- Currently in maintenance mode; it is recommended to use
WebClientorRestClientfor new projects.
Example Usage
@Service
@RequiredArgsConstructor
public class ExternalApiService {
private final RestTemplate restTemplate;
public UserDto getUser(Long id) {
String url = "https://api.example.com/users/" + id;
return restTemplate.getForObject(url, UserDto.class);
}
}
2. WebClient (Asynchronous Processing)
WebClient is a modern Non-blocking, Asynchronous client introduced with Spring 5.0 (WebFlux).
Characteristics
- High resource efficiency as threads can perform other tasks while waiting for a response.
- Can also be used synchronously via
.block(). - Essential for high-traffic or reactive programming environments.
Asynchronous Example
public Mono<UserDto> getUserAsync(Long id) {
return webClient.get()
.uri("/users/{id}", id)
.retrieve()
.bodyToMono(UserDto.class); // Returns a Mono containing data asynchronously
}
3. RestClient (New in Spring 6.1)
Introduced in Spring 6.1, RestClient is a new synchronous HTTP client that combines the blocking nature of RestTemplate with the modern fluent API of WebClient.
Characteristics
- The successor to
RestTemplate, featuring a contemporary API structure similar toWebClient. - Allows writing elegant code without requiring the full WebFlux dependency.
Example Usage
UserDto user = restClient.get()
.uri("/users/{id}", id)
.retrieve()
.body(UserDto.class);
4. Java Standard HttpClient (Java 11+)
The built-in client provided by pure Java (JDK 11 and above) without external library requirements.
Example Usage
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com"))
.build();
// Asynchronous processing
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
5. Summary Comparison
| Client | Mode | Recommendation |
|---|---|---|
| RestTemplate | Synchronous | Maintenance of legacy projects |
| RestClient | Synchronous | ** Recommended for new Spring 6.1+ sync calls** |
| WebClient | Sync/Async | ** Essential for high traffic or async needs** |
| HttpClient | Sync/Async | Environments avoiding extra local libraries |
If you are using Spring Boot 3.2 or above, we strongly recommend using the more intuitive and modern RestClient over the deprecated RestTemplate.