获取 Spring WebClient 请求的状态代码

Get status code of Spring WebClient request

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

我以前的做法是:

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

使用 Spring Boot 2.4.x/Spring 5.3,WebClient 的 exchange 方法已弃用,取而代之的是 retrieve.

在 的帮助下,我设法创建了以下解决方案。

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

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

这个问题可以用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();