You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Webflux WebClient的exchangeToMono中提取请求头与响应体

WebClient exchangeToMono() 同时获取响应头与响应体示例

当exchange()被废弃后,exchangeToMono()允许你直接操作ClientResponse对象——该对象包含了完整的响应元数据(响应头、状态码等)和响应体。要同时获取这两部分内容,只需在exchangeToMono()的处理逻辑中分别提取,再封装成自定义对象即可。

步骤1:定义封装响应的自定义类

先创建一个类来同时承载响应头和响应体:

import org.springframework.http.HttpHeaders;

public class ResponseWithHeaders<T> {
    private HttpHeaders headers;
    private T body;

    public ResponseWithHeaders(HttpHeaders headers, T body) {
        this.headers = headers;
        this.body = body;
    }

    public HttpHeaders getHeaders() {
        return headers;
    }

    public T getBody() {
        return body;
    }
}

步骤2:使用exchangeToMono()实现核心逻辑

下面是完整的WebClient调用示例,展示如何同时获取响应头和响应体:

import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

public class WebClientExample {
    private final WebClient webClient = WebClient.create("https://api.example.com");

    public Mono<ResponseWithHeaders<User>> fetchUserWithHeaders(String userId) {
        return webClient.get()
                .uri("/users/{id}", userId)
                .exchangeToMono(response -> {
                    // 提取响应头
                    HttpHeaders headers = response.headers().asHttpHeaders();
                    // 提取响应体并转换为目标类型
                    Mono<User> bodyMono = response.bodyToMono(User.class);
                    // 将响应头和响应体组合成自定义对象
                    return bodyMono.map(body -> new ResponseWithHeaders<>(headers, body));
                });
    }

    // 示例User实体类
    static class User {
        private String id;
        private String name;
        
        // 省略getter、setter、构造函数
    }
}

扩展场景说明

  • 响应体为集合类型:若返回的是列表数据,可改用bodyToFlux配合collectList处理:
public Mono<ResponseWithHeaders<List<User>>> fetchUsersWithHeaders() {
    return webClient.get()
            .uri("/users")
            .exchangeToMono(response -> {
                HttpHeaders headers = response.headers().asHttpHeaders();
                Mono<List<User>> bodyMono = response.bodyToFlux(User.class).collectList();
                return bodyMono.map(body -> new ResponseWithHeaders<>(headers, body));
            });
}
  • 添加状态码校验:可在逻辑中加入响应状态判断,只处理成功响应:
.exchangeToMono(response -> {
    if (response.statusCode().is2xxSuccessful()) {
        HttpHeaders headers = response.headers().asHttpHeaders();
        return response.bodyToMono(User.class)
                .map(body -> new ResponseWithHeaders<>(headers, body));
    } else {
        // 处理错误响应,比如抛出异常
        return response.createException().flatMap(Mono::error);
    }
});

内容的提问来源于stack exchange,提问作者SHAO CHUN CHENG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:40:26