首页 > 解决方案 > 获取 Spring WebClient 请求的状态码

问题描述

我的目标是从 Spring WebClient 请求中获取 HttpStatus。请求的所有其他信息都无关紧要。

我这样做的旧方法是:

WebClient.builder().baseUrl("url").build()
        .get().exchange().map(ClientResponse::statusCode).block();

在 Spring Boot 2.4.x/Spring 5.3 中,exchange不推荐使用 WebClient 的方法,取而代之的是retrieve.

在https://stackoverflow.com/a/65791800的帮助下,我设法创建了以下解决方案。

WebClient.builder().baseUrl("url").build()
        .get().retrieve()
        .toEntity(String.class)
        .flatMap(entity -> Mono.just(entity.getStatusCode()))
        .block();

但是,这看起来是一种非常“hacky”的方式,并且在收到 4xx 或 5xx 响应时不起作用(在这种情况下,结果为空)。

标签: javaspringspring-bootspring-webclient

解决方案


这个问题可以用方法解决exchangeToMono。这导致以下代码段。

WebClient.builder().baseUrl("url").build()
        .get().exchangeToMono(response -> Mono.just(response.statusCode()))
        .block();

retrieve方法的使用可以通过以下方式改进,仍然不是很干净。

WebClient.builder().baseUrl("url").build()
        .get().retrieve()
        .onStatus(httpStatus -> true, clientResponse -> {
            //Set variable to return here
            status.set(clientResponse.statusCode());
            return null;
        })
        .toBodilessEntity().block();

推荐阅读