从 ServerHttpRequest/Flux<DataBuffer> 获取请求正文字符串 [英] Get request body string from ServerHttpRequest / Flux&lt;DataBuffer&gt;

查看:179
本文介绍了从 ServerHttpRequest/Flux<DataBuffer> 获取请求正文字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是 spring boot 版本 - 2.0.6.RELEASE 和 spring cloud 版本 - Finchley.SR2

I am using spring boot version - 2.0.6.RELEASE and spring cloud version - Finchley.SR2

并且我已经创建了我的自定义网关过滤器来修改请求正文.

and i have created my custom gateway filter to modify the request body.

但是在使用 Flux 将请求正文转换为字符串时,我得到了一个空字符串.我需要一种方法来获取与我的请求正文对应的字符串.

but while converting the request body to string using Flux i am getting a empty string. i need a method to get the string corresponding to my request body.

@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    ServerHttpRequest request = (ServerHttpRequest) exchange.getRequest();
    String s = resolveBodyFromRequest(request);
     /* s comes out to be "" */
    return chain.filter(newExchange);


}



private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest){
    //Get the request body
    Flux<DataBuffer> body = serverHttpRequest.getBody();
    StringBuilder sb = new StringBuilder();

    body.subscribe(buffer -> {
        byte[] bytes = new byte[buffer.readableByteCount()];
        buffer.read(bytes);
        DataBufferUtils.release(buffer);
        String bodyString = new String(bytes, StandardCharsets.UTF_8);
        sb.append(bodyString);
    });
    return sb.toString();

}

推荐答案

您可以使用 ModifyRequestBodyGatewayFilterFactory 我相信它包含在 Spring Cloud Gateway 2.0.2 中,它是 Finchley.

You could use the ModifyRequestBodyGatewayFilterFactory which I believe is included in Spring Cloud Gateway 2.0.2 which is part of Finchley.

例如:

@Override
public GatewayFilter apply(Config config) {
   return (exchange, chain) -> {
        ModifyRequestBodyGatewayFilterFactory.Config modifyRequestConfig = new ModifyRequestBodyGatewayFilterFactory.Config()
                .setContentType(ContentType.APPLICATION_JSON.getMimeType())
                .setRewriteFunction(String.class, String.class, (exchange1, originalRequestBody) -> {
                    String modifiedRequestBody = yourMethodToModifyRequestBody(originalRequestBody);
                    return Mono.just(modifiedRequestBody);
                });

        return new ModifyRequestBodyGatewayFilterFactory().apply(modifyRequestConfig).filter(exchange, chain);
    };
}

这篇关于从 ServerHttpRequest/Flux<DataBuffer> 获取请求正文字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆