В форме, которая у вас есть в настоящее время, и объясняя поведение ..
WebClient webClient = WebClient.create();
webClient.get()
.uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available")
.exchange()
.block();
block()
запускает запрос, внутренне синхронно подписываясь на Mono
, и возвращает результат ClientResponse
. Вы также можете обработать это асинхронно, вызвав subscribe()
в Mono
, возвращаемом методом exchange()
, вместо block()
.
В этой текущей форме после block()
у вас теперь есть все метаданные (ie. из заголовка ответа) об ответе в объекте ClientResponse
, включая статус успеха. Это не означает, что тело ответа перестало поступать. Если вас не интересует полезная нагрузка ответа, вы можете подтвердить успех и оставить все как есть.
Если вы хотите дополнительно посмотреть тело ответа, вам нужно преобразовать поток тела ответа в некоторый класс . На этом этапе вы можете решить, хотите ли вы прочитать все в одном Mono
с bodyToMono
или в поток объектов (Flux
) с bodyToFlux
, например, в случае, когда ответом является JSON массив, который может быть проанализирован на отдельные отдельные объекты Java.
Однако в вашем случае вы просто хотите видеть JSON как есть. Так что преобразования в String
достаточно. Вы могли бы просто использовать bodyToMono
, который вернет объект Mono
.
WebClient webClient = WebClient.create();
String responseJson = webClient.get()
.uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available")
.exchange()
.block()
.bodyToMono(String.class)
.block();
Здесь вы используете block()
, чтобы дождаться прибытия полезной нагрузки ответа и ее синтаксического анализа в String
, но вы также можно subscribe
в Mono
, чтобы получить его в ответ, когда он будет завершен.
Следует отметить, что retrieve()
можно использовать вместо exchange()
для ярлыка ClientResponse
. В этом случае вы позволяете поведению по умолчанию обрабатывать ответы об ошибках. Использование exchange()
возлагает всю ответственность на приложение за реагирование на сообщения об ошибках на ClientResponse
. Подробнее в Javado c. Версия retrieve()
будет выглядеть следующим образом. Не нужно набирать block()
, поскольку вас интересуют только данные ответа.
WebClient webClient = WebClient.create();
String responseJson = webClient.get()
.uri("https://petstore.swagger.io/v2/pet/findByStatus?status=available")
.retrieve()
.bodyToMono(String.class)
.block();