web-dev-qa-db-ja.com

Spring 5 WebClient ClientResponseから応答ヘッダーとステータスコードを抽出する方法

私はSpring Reactiveフレームワークに不慣れで、Springboot 1.5.xコードをSpringboot 2.0に変換しようとしています。 Spring 5 WebClient ClientResponseからのフィルタリング、ボディ、ステータスコードの後に​​応答ヘッダーを返す必要があります。同期呼び出しに変換するため、block()メソッドは使用しません。 bodyToMonoを使用すると、かなり簡単にresponsebodyを取得できます。また、ClientResponseを返すだけの場合は、ステータスコード、ヘッダー、本文を取得しますが、statusCodeとヘッダーパラメーターに基づいて応答を処理する必要があります。サブスクライブ、flatMapなどを試しましたが、何も動作しません。

例えば。 -以下のコードは応答本文を返します

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

しかし、同様のパラダイムがstatusCodeおよびResponseヘッダーを取得するように機能していません。誰かがSpring 5反応フレームワークを使用してstatusCodeとヘッダーパラメーターを抽出するのを手伝ってくれる?.

10
Renus11

Webクライアントの交換機能を使用できます。

Mono<String> 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などを変換できます

4
Kevin Hussey

WebClientを使用している場合は、Spring Boot> = 2.1.0を構成して、リクエストとレスポンスをログに記録できます。

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();

ただし、これにより機密情報がログに記録される可能性があることに注意してください。

2
Tobske

応答の詳細(ヘッダー、ステータスなど)と本文も確認する必要がありました。

私がそれを行うことができた唯一の方法は、次の例のように2つの.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
    });

お役に立てば幸いです。誰かがより良い方法を知っている場合は、お知らせください。

2
Rafael Amaral

ステータスコードについては、これを試すことができます:

Mono<HttpStatus> status = webClient.get()
                .uri("/example")
                .exchange()
                .map(response -> response.statusCode());

ヘッダーの場合:

Mono<HttpHeaders> result = webClient.get()
                .uri("/example")
                .exchange()
                .map(response -> response.headers().asHttpHeaders());
1
Shreya Sharma