Spring Cloud Gateway filter中获取request.body

发布于 2022-09-11 16:09:26 字数 1945 浏览 36 评论 0

问题描述

在自建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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

迷雾森÷林ヴ 2022-09-18 16:09:26

这个问题解决了吗? 我现在也遇到这个问题。

苍暮颜 2022-09-18 16:09:26

看我博客里讲的有,https://blog.csdn.net/tianyal...

牵你的手,一向走下去 2022-09-18 16:09:26

可以先配置一个ReadBodyPredicateFactory预言类,然后在缓存中获取,可以参看这篇博客: http://blog.51cto.com/thinklili

痕至 2022-09-18 16:09:26

遇到同样的问题,目前也没有思路,不过昨天取到了post的body参数,今天代码没有改动就取不到了。请求也是完全一样的。

半城柳色半声笛 2022-09-18 16:09:26

如果你需要先获取body,后进行转发,就不应该把这2步分开操作。
可以试着像下面这样写:

DefaultServerRequest req = new DefaultServerRequest(exchange);
ServerHttpResponse response = exchange.getResponse();
return req.bodyToMono(String.class)
        .map(str -> {
            System.out.println("str: " + str);
            return str;
        }).then(response.writeWith(Mono.empty()));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文