WebFlux 2.5.2如何从ServerRequest中提取POST请求的纯文本请求体
问题原因及解决方法
你当前使用request.bodyToMono(String.class)本身就是从ServerRequest提取纯文本请求体的正确方法,代码无法正常运行是因为Reactive流的操作逻辑有误:
- Reactor中Mono/Flux都是不可变对象,调用
map/flatMap等操作符后会返回全新的Mono/Flux实例,不会修改原对象。你代码中responseBody.map(s -> s + " -- 服务端添加的内容.")执行后没有接收返回值,这行代码属于无效操作,最终返回的还是未经过处理的原始请求体Mono。 - 如果你是在断点调试时直接查看Mono实例的取值报错,属于正常现象:Mono是异步数据流容器,只有被订阅时才会触发数据发射,不能以同步方式直接读取内部的值。
修正后的完整代码
修改AppHandler中的process方法即可:
public Mono<ServerResponse> process(ServerRequest request){ // 链式操作所有流处理逻辑,最后直接拼接返回逻辑 return request.bodyToMono(String.class) // 如果需要调试查看请求体内容,添加doOnNext回调即可 .doOnNext(rawBody -> System.out.println("接收到的纯文本请求体:" + rawBody)) // 处理请求体内容 .map(rawBody -> rawBody + " -- 服务端添加的内容.") // 构造响应 .flatMap(processedBody -> ServerResponse.ok() .contentType(MediaType.TEXT_PLAIN) .bodyValue(processedBody)); }
注意事项
你当前路由配置中指定了POST接口的contentType(MediaType.TEXT_PLAIN),所以调用该接口时必须在请求头中设置Content-Type: text/plain,否则会返回415不支持的媒体类型错误。如果需要支持接收任意类型的纯文本内容,可以去掉路由中的contentType限制,或者添加更多支持的媒体类型规则。
内容的提问来源于stack exchange,提问作者MMR
相关产品推荐
相关产品推荐

