Веб-клиент Spring Webflux

Я действительно не знаю, как правильно перевести следующий вызов веб-клиента spring webflux.

userIds - это список, и я смог вызвать службу, используя следующий синтаксис, но мне не удалось заставить это работать с Spring WebFlux WebClient. Пожалуйста, помогите мне, если кто-нибудь из вас знает, как это сделать.

String url = "http://profile.service.com/v1/profiles/bulk";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

ResponseEntity<List<MiniProfile>> responseEntity;
try {
    responseEntity = restTemplate.exchange(url, HttpMethod.POST, new 
    HttpEntity(userIds, headers), new 
    ParameterizedTypeReference<List<MiniProfile>>() {});
} catch (RestClientException e) {
    responseEntity = new ResponseEntity<List<MiniProfile>>(HttpStatus.OK);
}

return responseEntity.getBody();

Вот как я перевел его в Webflux WebClient:

Flux<String> flux = Flux.fromIterable(userIds);
return readWebClient.post().uri("/v1/profiles/bulk")
      .body(BodyInserters.fromPublisher(flux, String.class))
      .retrieve().bodyToFlux(MiniProfile.class);

person Eric Nguyen    schedule 25.11.2017    source источник
comment
что не работает с вашим текущим решением? Какой результат вы получаете? Чего вы ожидали вместо этого?   -  person Brian Clozel    schedule 26.11.2017
comment
Я получил код ошибки 500, откуда я не мог знать, и вот трассировка стека. org.springframework.web.reactive.function.client.WebClientResponseException: ClientResponse имеет ошибочный код состояния: 500 Внутренняя ошибка сервера. И я ожидаю, что наш сервис вернет список профилей. Обратите внимание, что старый код с RestTemplate у меня отлично работал.   -  person Eric Nguyen    schedule 27.11.2017
comment
это действительно важная информация, которая относится к вашему вопросу. Это говорит о том, что сервер отвечает HTTP 500. Таким образом, запросы должны быть разными для RestTemplate и WebClient.   -  person Brian Clozel    schedule 27.11.2017
comment
Я согласен с тем, что запросы в RestTemplate и WebClient должны быть разными. Я пытался увидеть, были ли запросы между ними разными, но я мог видеть только тело запроса RestTemplate, переведенное как массив строк, подобный этому [0449b652-0006-0000-0000-000000000000, 0333b652-0006-0000 -0000-000000000000], который отлично работал с нашей службой зависимостей, но я не мог видеть запрос в Netty WebClient как json, такой как RestTemplate, поэтому я не мог сказать, в чем заключаются различия. Вы хоть представляете, как я могу увидеть сериализованное тело запроса в Netty WebClient?   -  person Eric Nguyen    schedule 28.11.2017
comment
Вы можете установить уровень ведения журнала следующим образом: logging.level.reactor.ipc.netty.channel.ContextHandler=debug logging.level.reactor.ipc.netty.http.client.HttpClient=debug в вашем application.properties файле   -  person Brian Clozel    schedule 28.11.2017
comment
@BrianClozel После добавления уровней отладки большие разделы журнала выглядят как дамп TCP. Есть ли способ просмотреть тело как текст в файле журнала?   -  person Ashok Koyi    schedule 01.12.2017


Ответы (3)


Вы не должны менять свой список на flux, вы должны отправить его как список, подобный этому

return readWebClient.post()
  .uri("/v1/profiles/bulk")
  .syncBody(userIds)
  .retrieve()
  .bodyToFlux(new ParameterizedTypeReference<List<MiniProfile>>() {})
  .flatMapIterable(Function.identity());

этот код не протестирован, но принцип тот же

person hishammuddin-sani    schedule 18.05.2018
comment
спасибо за то, что вы нашли время ответить на мой вопрос, но с вашим кодом или моим кодом все в порядке, но реальная проблема была в нашем стеке .NET, когда мы используем Webflux Webclient для размещения или публикации в стеке .NET, нам нужно обрабатывать необработанный запрос в Стек .NET. - person Eric Nguyen; 19.05.2018

Используйте .bodyValue(userIds) или .syncBody(userIds) (устарело) вместо тела с устройством вставки тела

person ashanshamika    schedule 06.12.2019

** вы можете сослаться на указанные ниже фрагменты кода **

WebClient.post().uri(endPointUrl)
           .contentType(MediaType.APPLICATION_XML)
          .body(Mono.just(xmlEntity), String.class)
          .retrieve()
person ramakotireddy nagireddy    schedule 21.01.2021