如何从Spring 5 WebClient ClientResponse中提取响应标头和状态代码

2022-09-01 09:30:07

我是Spring Reactive框架的新手,并试图将Springboot 1.5.x代码转换为Springboot 2.0。我需要从Spring 5 WebClient ClientResponse进行一些过滤,body和状态代码后返回响应标头。我不想使用block()方法,因为它会将其转换为同步调用。我能够非常轻松地使用bodyToMono获得响应体。另外,如果我只是返回 ClientResponse,我会得到状态代码、标头和正文,但我需要根据 statusCode 和标头参数处理响应。我尝试订阅,平面地图等,但没有任何效果。

例如 - 下面的代码将返回响应正文

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

但类似的范式并不能获得statusCode和Responsue标头。有人可以帮助我使用Spring 5反应式框架提取statusCode和head参数吗?


答案 1

您可以使用Webclient的交换功能,例如

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

然后你可以转换身体到Mono等


答案 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
    });

我希望它有帮助。如果有人知道更好的方法,请告诉我们。


推荐