Как извлечь заголовок ответа и код состояния из Spring 5 WebClient ClientResponse - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в Spring Reactive Framework и пытаюсь преобразовать код Springboot 1.5.x в Springboot 2.0. Мне нужно вернуть заголовок ответа после некоторой фильтрации, тела и кода состояния из Spring 5 WebClient ClientResponse. Я не хочу использовать метод block (), так как он преобразует его в вызов синхронизации. Я могу довольно легко получить ответ с помощью bodyToMono. Кроме того, я получаю код состояния, заголовки и тело, если я просто возвращаю ClientResponse, но мне нужно обработать ответ на основе параметров statusCode & header. Я пытался подписаться, flatMap и т. Д., Но ничего не работает.

например. - Ниже код вернет ответ Body

Mono<String> responseBody =  response.flatMap(resp -> resp.bodyToMono(String.class));

Но подобная парадигма не работает для получения заголовков statusCode & Response. Может кто-нибудь помочь мне в извлечении параметров statusCode и header, используя реактивную среду Spring 5.

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Мне нужно было проверить детали ответа (заголовки, статус и т. Д.), А также текст сообщения.

Единственным способом, которым я смог это сделать, было использование .exchange() с двумя subscribe() в качестве следующего примера:

    Mono<ClientResponse> clientResponse = WebClient.builder().build()
            .get().uri("https://stackoverflow.com")
            .exchange();

    clientResponse.subscribe((response) -> {

        // here you can access headers and status code
        Headers headers = response.headers();
        HttpStatus stausCode = response.statusCode();

        Mono<String> bodyToMono = response.bodyToMono(String.class);
        // the second subscribe to access the body
        bodyToMono.subscribe((body) -> {

            // here you can access the body
            System.out.println("body:" + body);

            // and you can also access headers and status code if you need
            System.out.println("headers:" + headers.asHttpHeaders());
            System.out.println("stausCode:" + stausCode);

        }, (ex) -> {
            // handle error
        });
    }, (ex) -> {
        // handle network error
    });

Надеюсь, это поможет. Если кто-то знает лучший способ сделать это, пожалуйста, сообщите нам.

0 голосов
/ 03 января 2019

Вы можете настроить весеннюю загрузку> = 2.1.0 для регистрации запросов и ответов, если вы используете WebClient:

spring.http.log-request-details: true
logging.level.org.springframework.web.reactive.function.client.ExchangeFunctions: TRACE

Как описано в загрузочных документах спринта , если вы хотите, чтобы заголовки тоже регистрировались, вы должны добавить

Consumer<ClientCodecConfigurer> consumer = configurer ->
    configurer.defaultCodecs().enableLoggingRequestDetails(true);

WebClient webClient = WebClient.builder()
    .exchangeStrategies(ExchangeStrategies.builder().codecs(consumer).build())
    .build();

Но имейте в виду, что это может регистрировать чувствительную информацию.

0 голосов
/ 18 мая 2018

Вы можете использовать функцию обмена веб-клиента, например:

Mono<ClientResponse> reponse = webclient.get()
.uri("https://stackoverflow.com)
.exchange()
.doOnSuccess(clientResponse -> System.out.println("clientResponse.headers() = " + clientResponse.headers()))
.doOnSuccess(clientResponse -> System.out.println("clientResponse.statusCode() = " + clientResponse.statusCode()))
.flatMap(clientResponse -> clientResponse.bodyToMono(String.class));

тогда вы можете конвертировать bodyToMono и т. Д.

...