Spring Cloud Gateway — 获取RequestBody(解决RequestBody不完整的问题)

导读:本篇文章讲解 Spring Cloud Gateway — 获取RequestBody(解决RequestBody不完整的问题),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Spring Cloud Gateway — 获取RequestBody(解决RequestBody不完整的问题)

前言

之前在修改RequestBody和Header这篇文章中有个对于获取RequestBody的猜想,现在在使用过程中发现了这个问题(RequestBody不完整的问题)

获取RequestBody

之前是通过这个方法来获取RequestBody,现在发现请求参数一多就会出现参数获取不完整的情况。

private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) throws UnsupportedEncodingException {
        //获取请求体
        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);
        });
        //System.out.println(sb.toString());
        return URLDecoder.decode(sb.toString(),"utf-8");
    }

解决办法

修改路由

			.route("route1",
			           r -> r.method(HttpMethod.POST)
			                   .and().readBody(String.class, requestBody -> {
			               // 这里不对body做判断处理
			               return true;
			           }).and().path(SERVICE1)
			           .filters(f -> {
			               f.filters(list);
			               return f;
			           }).uri(URI));

修改获取RequestBody方法

Object requestBody = URLDecoder.decode(exchange.getAttribute("cachedRequestBodyObject").toString(),"utf-8");

说明

这种解决方法,不会带来requestbody取不全问题。在低版本的Spring Cloud Finchley.SR2也可以运行。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15317.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!