中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

SpringCloudGateway獲取post請求體(requestbody)

獲取spring cloud gateway POST請求體的時候,會有很多坑,網上大多數解決方案是

海倫網站制作公司哪家好,找創新互聯建站!從網頁設計、網站建設、微信開發、APP開發、自適應網站建設等網站項目制作,到程序開發,運營維護。創新互聯建站從2013年成立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創新互聯建站

/**
這種方法在spring-boot-starter-parent 2.0.6.RELEASE + Spring Cloud Finchley.SR2 body 中生效, 
但是在spring-boot-starter-parent 2.1.0.RELEASE + Spring Cloud Greenwich.M3 body 中不生效,總是為空
*/
private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {
        Flux<DataBuffer> body = serverHttpRequest.getBody();
        AtomicReference<String> bodyRef = new AtomicReference<>();
        body.subscribe(buffer -> {
            CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
            DataBufferUtils.release(buffer);
            bodyRef.set(charBuffer.toString());
        });
        return bodyRef.get();
    }

但是實際這種解決方案(例如 這篇文章)會帶來很多問題,比如request不能在其他filter中獲取,會報錯:

reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalStateException: Only one connection receive subscriber allowed.
Caused by: java.lang.IllegalStateException: Only one connection receive subscriber allowed.

針對這種不能重復獲取的問題,網上通用解決是把request重新包裝,繼續傳遞,比如 這篇文章的解決方案。
但是這種方案還會帶來request body獲取不完整,只能獲取1024B的數據,這個問題暫時沒有很好的解法,很頭痛,在給官方提issues的時候,issues709 和issues707 的時候,對方讓我參看一個類ModifyRequestBodyGatewayFilterFactory.java,說真的并沒有看懂,最后翻源碼的時候,發現了一個預言類,ReadBodyPredicateFactory ,發現里面緩存了request body的信息,于是在自定義router中配置了ReadBodyPredicateFactory,然后在filter中通過cachedRequestBodyObject緩存字段獲取request body信息,這種解決,一不會帶來重復讀取問題,二不會帶來requestbody取不全問題。三在低版本的Spring Cloud Finchley.SR2也可以運行。

step 1:現在自動以router里面配置ReadBodyPredicate預言類:
RouteLocatorBuilder.Builder serviceProvider = builder.
                routes().route("gateway-sample",
                    r -> r.readBody(Object.class, requestBody -> {
                        log.info("requestBody is {}", requestBody);
                        // 這里不對body做判斷處理
                        return true;
                }).and().path("/service").
                        filters(f -> {
                            f.filter(requestFilter);
                            return f;
                        })
                        .uri("http://127.0.0.1:8009"));
        RouteLocator routeLocator = serviceProvider.build();

step2:在自定義filter中獲取緩存了的request body:
      Object requestBody = exchange.getAttribute("cachedRequestBodyObject");

至此問題解決,完整代碼在我的github上面。參考這里。

參考:
https://www.cnblogs.com/cafebabe-yun/p/9328554.html
https://blog.csdn.net/tianyaleixiaowu/article/details/83375246

網站名稱:SpringCloudGateway獲取post請求體(requestbody)
分享地址:http://www.2m8n56k.cn/article32/jcgcpc.html

成都網站建設公司_創新互聯,為您提供Google云服務器營銷型網站建設網站改版用戶體驗

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站建設
主站蜘蛛池模板: 一级网站在线观看 | 国产精品欧美视频另类专区 | 日本三级韩国三级在线观看a级 | 国产aaa毛片| 欧美一级一级片 | 亚洲图片一区二区 | 一区自拍 | 看毛片的网址 | 亚洲在线观看免费视频 | 国产免费成人在线视频 | 成人免费看www网址入口 | 日韩一区二区视频在线观看 | 九九草在线观看 | 亚洲人欧洲日韩 | 亚洲区一区 | 国产色视频在线观看免费 | 免费成年人在线观看视频 | 久久精品国产精品亚洲人人 | 一个人看的免费观看日本视频www | 欧美一级免费在线观看 | 在线黄网 | 国产成人美女福利在线观看 | 欧美日韩一区二区三在线 | 国内自拍网红在线综合 | 国产亚洲女在线精品 | 免费国产午夜高清在线视频 | 免费在线观看a级毛片 | 成人手机在线视频 | 最刺激黄a大片免费网站 | 欧美一级免费看 | 欧美日韩一区二区在线 | 亚洲天堂视频在线观看免费 | 国产精品成人久久久久久久 | 99久久精品费精品国产一区二 | 国内精品国语自产拍在线观看55 | 99精品99| 免费成人一级片 | 日日摸人人拍人人澡 | 精品国产无限资源免费观看 | 国产在线视频网址 | 男人和女人在床做黄的网站 |