Замена restTemplate на webClient
У меня есть контроллер, который использует RestTemplate
получить данные от нескольких конечных точек отдыха. Поскольку RestTemplate блокируется, загрузка моей веб-страницы занимает много времени. Чтобы повысить производительность, я планирую заменить все свои RestTeamplate
с Spring WebClient
, Один из методов, которые у меня сейчас есть, использует RestTemplate
как ниже.
public List<MyObject> getMyObject(String input){
URI uri = UriComponentsBuilder.fromUriString("/someurl")
.path("123456")
.build()
.toUri();
RequestEntity<?> request = RequestEntity.get(uri).build();
ParameterizedTypeReference<List<MyObject>> responseType = new ParameterizedTypeReference<List<MyObject>>() {};
ResponseEntity<List<MyObject>> responseEntity = restTemplate.exchange(request, responseType);
MyObject obj= responseEntity.getBody();
}
Теперь я хочу заменить мой метод выше, чтобы использовать WebClient
но я новичок в WebClient
и не уверен, с чего начать. Любое направление и помощь приветствуется.
1 ответ
Чтобы помочь вам, я приведу пример того, как мы можем заменить restTemple на webClient. Я надеюсь, что вы уже настроили свой pom.xml
Создан класс конфигурации.
@Slf4j
@Configuration
public class ApplicationConfig {
/**
* Web client web client.
*
* @return the web client
*/
@Bean
WebClient webClient() {
return WebClient.builder()
.filter(this.logRequest())
.filter(this.logResponse())
.build();
}
private ExchangeFilterFunction logRequest() {
return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
log.info("WebClient request: {} {} {}", clientRequest.method(), clientRequest.url(), clientRequest.body());
clientRequest.headers().forEach((name, values) -> values.forEach(value -> log.info("{}={}", name, value)));
return Mono.just(clientRequest);
});
}
private ExchangeFilterFunction logResponse() {
return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
log.info("WebClient response status: {}", clientResponse.statusCode());
return Mono.just(clientResponse);
});
}
}
Плюс класс обслуживания, вызывающий WebClient
@Component
@RequiredArgsConstructor
public class MyObjectService {
private final WebClient webClient;
public Mono<List<Object>> getMyObject(String input) {
URI uri = UriComponentsBuilder.fromUriString("/someurl")
.path("123456")
.build()
.toUri();
ParameterizedTypeReference<List<MyObject>> responseType = new ParameterizedTypeReference<List<MyObject>>() {
};
return this.webClient
.get()
.uri(uri)
.exchange()
.flatMap(response -> response.bodyToMono(responseType));
}
}
Это даст вам не блокирующий моно List<MyObject>
, вы также можете извлечь тело, чтобы использовать response.bodyToFlux(responseType)
Я надеюсь, что это даст вам базу для изучения большего.