如何使用WebClient将Flux中的消息作为独立请求发送?
为每条消息发送独立HTTP请求的解决方案
你当前的代码确实会将所有Message对象打包成一个请求体批量发送,不符合对接API的限制要求。要实现单消息对应单请求,并获取每个请求的MessageResponse,可以通过flatMap操作符对Flux<Message>中的每个元素单独发起请求:
Flux<Message> messages = // 你的消息流 Flux<MessageResponse> responseFlux = messages.flatMap(message -> webClient.post() .uri(messageUri) .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) .bodyValue(message) // 传递单个Message作为请求体 .retrieve() .bodyToMono(MessageResponse.class) // 单个请求对应单个响应 );
关键说明:
flatMap会遍历消息流中的每一个Message,为其创建独立的POST请求,最终将所有请求的响应合并成一个Flux<MessageResponse>- 使用
bodyValue替代原代码中的body,因为bodyValue专门用于传递单个对象作为请求体,而body接收流时会做批量处理 - 每个请求返回单个
MessageResponse,因此用bodyToMono接收响应,flatMap会自动将多个Mono合并为Flux
如果需要控制并发请求数量(避免因请求过多压垮目标API),可以使用flatMap的重载版本指定并发量:
Flux<MessageResponse> responseFlux = messages.flatMap(message -> webClient.post() .uri(messageUri) .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) .bodyValue(message) .retrieve() .bodyToMono(MessageResponse.class), 5 // 限制同时发起5个并发请求 );
内容的提问来源于stack exchange,提问作者matsev
相关产品推荐
相关产品推荐

