前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GateWay 修改请求内容(post)

GateWay 修改请求内容(post)

作者头像
用户10325771
发布2023-03-01 17:11:29
1.1K0
发布2023-03-01 17:11:29
举报
文章被收录于专栏:java springboot docker

1、自定义网关过滤器实现 GlobalFilter, Ordered

代码语言:javascript
复制
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        对阿里网关添加参数统一处理

        if (HttpMethod.POST.matches(method)) {
            return DataBufferUtils.join(request.getBody()).flatMap(dataBuffer -> {
//                读取
                CharBuffer charBuffer = StandardCharsets.UTF_8.decode(dataBuffer.asByteBuffer());
//                释放
                DataBufferUtils.release(dataBuffer);
                //进行想要的处理即可
                return chain.filter(exchange.mutate().request(createServerHttpRequest(request, queryParam.getUri(), object)).build());
            });
        } else if (HttpMethod.GET.matches(method)) {
//            重写参数
            return chain.filter(exchange.mutate().request(request.mutate().uri(queryParam.getUri()).build()).build());
        }
        return chain.filter(exchange);
    }

2、注意点

代码语言:javascript
复制
ServerHttpRequest request = exchange.getRequest();
exchange.getRequest().getBody()

在读取body内容时不要使用exchange.getRequest().getBody().subscribe()去实现,可能本人比较菜不知道具体使用方法,如果有人指出请评论

修改完body进行回写时,注意时修改header 的 ContentLength ,修改body之后http协议 ContentLength 会有变化最好重新写入新的body对应字节长度

代码语言:javascript
复制
newRequest = new ServerHttpRequestDecorator(newRequest) {
    @NonNull
    @Override
    public Flux<DataBuffer> getBody() {
        return Flux.defer(() -> Mono.just(bodyDataBuffer));
    }

    @NonNull
    @Override
    public HttpHeaders getHeaders() {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.putAll(super.getHeaders());
        if (bodyDataBuffer.capacity() > 0) {
            httpHeaders.setContentLength(bodyDataBuffer.capacity());
        } else {
            // TODO: this causes a 'HTTP/1.1 411 Length Required' on httpbin.org
            httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
        }
        return httpHeaders;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、自定义网关过滤器实现 GlobalFilter, Ordered
  • 2、注意点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档