如何从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
相关产品推荐
相关产品推荐

