SpringBoot 如何获取原始请求体 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
superdingdang
V2EX    Java

SpringBoot 如何获取原始请求体

  •  
  •   superdingdang Jul 9, 2021 4973 views
    This topic created in 1753 days ago, the information mentioned may be changed or developed.

    也就是这种:

    HTTP/1.1 200 OK Date: Mon, 10 Jul 2021 15:50:06 GMT Content-Length: 256 Content-Type: text/html 
    Supplement 1    Jul 9, 2021
    抱歉,上面那串 http 报文是随便复制的,没注意到是 response,现在来更正一下

    GET /doXxx HTTP/1.1
    Host: www.liaoxuefeng.com
    Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache
    sec-ch-ua: " Not;A Brand";v="99", "Microsoft Edge";v="91", "Chromium";v="91"
    21 replies   &nbp;2021-07-26 09:15:36 +08:00
    nvkou
        1
    nvkou  
       Jul 9, 2021 via Android
    到 controller 不都是 serverlet request 吗。全都包装好的
    lululau
        2
    lululau  
       Jul 9, 2021 via iPhone
    Spring boot 和 http 请求有啥关系。。。
    ljhrot
        3
    ljhrot  
       Jul 9, 2021 via Android
    不如说说你为什么需要获取 HTML 请求报文?
    qwerthhusn
        4
    qwerthhusn  
       Jul 9, 2021   1
    这个是响应的一部分,跟请求体有毛关系。

    建议买《图解 TCP/IP 》、《图解 HTTP 》和《图解密码技术》三本很浅显易懂的“科普”书扫盲
    lybcyd
        5
    lybcyd  
       Jul 9, 2021
    这个是 Response 吧。如果你用的是 ajax,直接浏览器就能看。如果你知道自己需要获取请求属性,RequestEntity 或者 HttpServletRequest 都有 api 能看。
    unco020511
        6
    unco020511  
       Jul 9, 2021
    这是响应报文啊
    huang119412
        7
    huang119412  
       Jul 9, 2021
    http 协议分为状态行,header 和 body,request 对象可以获取所有 header,根据 Content-Type 不同,request 也可以获取所有 body,但是 body 是 raw ( application/json 之类)流形式 request 只能解析一次。request 也可以获取 requestURI,这样可以自己封装还原。
    当然可能也有日志配置之类直接能显示。
    最简单的是自己用基于 netty 的 http 服务器, http1.1 本来就是字符串明文,直接打印就可以了
    chendy
        8
    chendy  
       Jul 9, 2021
    这是响应啊。。。
    Spring Boot 和这玩意没关系,要看底层用的啥,一般都是 servlet,拿到的东西也都是解析出来的
    想要拿什么就去拿,想用什么格式拼就拼
    jimmyismagic
        9
    jimmyismagic  
       Jul 9, 2021
    @chendy
    @nvkou
    @huang119412 如何获得 json 字符串的原始流信息呢?大部分 controller 直接转成 java 对象了,有时候需要对这个流进行验签,这个怎么做?
    Elietio
        10
    Elietio  
       Jul 9, 2021
    @jimmyismagic 拦截器,注意如果是 post 请求 requestBody 需要拷贝一下流不能直接读取
    qwerthhusn
        11
    qwerthhusn  
       Jul 9, 2021
    @jimmyismagic 用 Filter,然后 Filter 里面用 getInputStream 读取本次请求所有内容,可以保存到文件,打印到日志干嘛都行。。。然后 InputStream 不能重复读,所以继续往下派发的时候,需要用个 RequestWrapper 重新生成一个 InputStream 给后面的重新读取
    SingeeKing
        12
    SingeeKing  
    PRO
       Jul 9, 2021 via iPhone
    我就感觉这个需求很奇怪,看了下 9 楼果然是 XY 问题,建议阅读下提问的智慧
    wombat
        13
    wombat  
       Jul 9, 2021
    HttpServletRequest 直接获取 body 的流,外加获取 header 里的信息。 你应该是遇到 签名再 header 里,报文在 body 里的场景吧。需要验签啥的。 不用用对象接受。
    0576coder
        14
    0576coder  
       Jul 9, 2021
    @jimmyismagic 直接读 body HttpServletRequest 有 API 的
    szq8014
        15
    szq8014  
       Jul 9, 2021
    @SingeeKing 哈哈哈哈
    jimmyismagic
        16
    jimmyismagic  
       Jul 9, 2021
    @SingeeKing 9 楼是我,不是作者,
    scxiazi
        17
    scxiazi  
       Jul 9, 2021
    验签就是拦截器读取下 body, 往后传的时候再包装下就行了
    zliea
        18
    zliea  
       Jul 9, 2021
    1. 需要 httpservletrequest 可以重复读流
    2. 然后就可以在各种地方读取不会影响现有逻辑。
    changdy
        19
    changdy  
       Jul 9, 2021   1
    最简单的 注入这个 bean , 注意下 maxPayloadLength

    AbstractRequestLoggingFilter

    话说 2,4 8 楼略苛刻 , 真的要说的话..spring boot 处理 http 请求的是 spring-boot-starter-web, 好像和 spring boot 有点关系吧.
    MidCoder
        20
    MidCoder  
       Jul 21, 2021
    现在的开发真的是啥都不会呀?一上来就是 springboot,又是 springcloud 。啥 j2ee,jdbc 都不会了?原来至少 struts2 和 springmvc 还能感受一下底层,自从各种 boot 出现之后,大家应该都不知道 web.xml 里面长啥样了吧?建议还是沉下心来去看看基础,不要整天浮在各种框架之上,不然你永远不知道这个世界是怎么样的
    golangLover
        21
    golangLover  
       Jul 26, 2021 via Android
    @qwerthhusn 我觉得这个是正解,遇到的都是用过滤器的,没见过用拦截器的
    About     Help     Advertise     Blog     API     FAQ     Solana     3900 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 71ms UTC 10:33 PVG 18:33 LAX 03:33 JFK 06:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86