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());
        };
    }
}

你期待的结果是什么?实际看到的错误信息又是什么?

请大家帮忙看看我处理过程中问题出在了哪?应该如何修正?非常感谢!

阅读 15.8k
5 个回答
新手上路,请多包涵

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

如果你需要先获取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()));
新手上路,请多包涵

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

新手上路,请多包涵
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题