Ba cách gọi HTTP từ Spring app đến external API:
| RestTemplate | WebClient | RestClient | |
|---|---|---|---|
| Model | Blocking | Non-blocking (reactive) | Blocking (fluent) |
| Status | ⚠ Maintenance mode | ✅ Active | ✅ Active (Spring 6.1) |
| API style | Template method | Fluent builder | Fluent builder |
RestTemplate (legacy, tránh dùng cho code mới):
java
RestTemplate rest = new RestTemplate();
User user = rest.getForObject("https://api.example.com/users/{id}", User.class, 1L);RestClient (Spring 6.1+ — recommended cho MVC):
java
@Bean
RestClient restClient() {
return RestClient.builder()
.baseUrl("https://api.example.com")
.defaultHeader("Authorization", "Bearer " + token)
.build();
}
User user = restClient.get()
.uri("/users/{id}", 1L)
.retrieve()
.body(User.class);
List<User> users = restClient.get()
.uri("/users?page=0&size=20")
.retrieve()
.body(new ParameterizedTypeReference<List<User>>() {});WebClient (cho reactive stack / WebFlux):
java
Mono<User> user = webClient.get()
.uri("/users/{id}", 1L)
.retrieve()
.bodyToMono(User.class);2026: dùng RestClient cho Spring MVC, WebClient cho Spring WebFlux. RestTemplate chỉ maintain, không dùng cho code mới.
Three ways to make HTTP calls from a Spring app to external APIs:
| RestTemplate | WebClient | RestClient | |
|---|---|---|---|
| Model | Blocking | Non-blocking (reactive) | Blocking (fluent) |
| Status | ⚠ Maintenance mode | ✅ Active | ✅ Active (Spring 6.1) |
| API style | Template method | Fluent builder | Fluent builder |
RestTemplate (legacy — avoid for new code):
java
RestTemplate rest = new RestTemplate();
User user = rest.getForObject("https://api.example.com/users/{id}", User.class, 1L);RestClient (Spring 6.1+ — recommended for MVC):
java
@Bean
RestClient restClient() {
return RestClient.builder()
.baseUrl("https://api.example.com")
.defaultHeader("Authorization", "Bearer " + token)
.build();
}
User user = restClient.get()
.uri("/users/{id}", 1L)
.retrieve()
.body(User.class);WebClient (for reactive stack / WebFlux):
java
Mono<User> user = webClient.get()
.uri("/users/{id}", 1L)
.retrieve()
.bodyToMono(User.class);2026: use RestClient for Spring MVC, WebClient for Spring WebFlux. RestTemplate is maintenance-only — do not use in new code.