замена restTemplate на webClient - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть контроллер, который использует 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 Ответ

2 голосов
/ 09 апреля 2019

Чтобы помочь вам, я приведу пример того, как мы можем заменить 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));
    }
}

Это даст вамНе блокируя Mono List<MyObject>, вы также можете извлечь тело в поток, используя response.bodyToFlux(responseType)

Я надеюсь, что это даст вам базу для изучения большего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...