私は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とヘッダーパラメーターを抽出するのを手伝ってくれる?.
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などを変換できます
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つの.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
});
お役に立てば幸いです。誰かがより良い方法を知っている場合は、お知らせください。
ステータスコードについては、これを試すことができます:
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());