Spring Cloud Gateway filter中获取request.body
问题描述
在自建Filter中如何获取完整的request.body信息?
问题出现的环境背景及自己尝试过哪些方法
在学习Spring Cloud Gateway自己写filter时,尝试通过exchange.getRequest().getBody获得请求消息体,但是出现无法获得完整消息体内容的问题,想请各位大神帮忙看看问题出在哪?应该如何调整?非常感谢。
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
@Component
public class PreGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
@Override
public GatewayFilter apply(Object config) {
// grab configuration from Config object
return (exchange, chain) -> {
//If you want to build a "pre" filter you need to manipulate the
//request before calling change.filter
//尝试1,直接通过操作Flux打印body内容,但是打印结果不完整,只有部分消息报文
ServerHttpRequest request = exchange.getRequest();
Flux<DataBuffer> dataFlux = request.getBody();
StringBuffer buffer = new StringBuffer();
dataFlux.log().flatMap(dataBuffer -> {
System.out.println("Thread - " + Thread.currentThread().getName() + ": readable count is " + dataBuffer.readableByteCount());
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
DataBufferUtils.release(dataBuffer);
return Mono.just(bytes);
}).subscribe(s -> System.out.println(new String(s)));
//尝试2,使用DefaultServerRequest封装后,通过BodyExtractors转换Mono<String>后打印,但是依然打印结果只有部分消息报文
/*DefaultServerRequest request = new DefaultServerRequest(exchange);
request.body(BodyExtractors.toMono(String.class)).log().subscribe(System.out::print);*/
//use builder to manipulate the request
ServerHttpResponse response = exchange.getResponse();
return response.writeWith(Mono.empty());
};
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
请大家帮忙看看我处理过程中问题出在了哪?应该如何修正?非常感谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这个问题解决了吗? 我现在也遇到这个问题。
看我博客里讲的有,https://blog.csdn.net/tianyal...
可以先配置一个ReadBodyPredicateFactory预言类,然后在缓存中获取,可以参看这篇博客: http://blog.51cto.com/thinklili
遇到同样的问题,目前也没有思路,不过昨天取到了post的body参数,今天代码没有改动就取不到了。请求也是完全一样的。
如果你需要先获取body,后进行转发,就不应该把这2步分开操作。
可以试着像下面这样写: