V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
superdingdang
V2EX  ›  Java

SpringBoot 如何获取原始请求体

  •  
  •   superdingdang · 2021-07-09 01:20:56 +08:00 · 4114 次点击
    这是一个创建于 1233 天前的主题,其中的信息可能已经有所发展或是发生改变。

    也就是这种:

    HTTP/1.1  200  OK
    Date: Mon, 10 Jul 2021 15:50:06 GMT
    Content-Length: 256
    Content-Type: text/html
    
    第 1 条附言  ·  2021-07-09 11:52:01 +08:00
    抱歉,上面那串 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 条回复    2021-07-26 09:15:36 +08:00
    nvkou
        1
    nvkou  
       2021-07-09 05:21:43 +08:00 via Android
    到 controller 不都是 serverlet request 吗。全都包装好的
    lululau
        2
    lululau  
       2021-07-09 07:38:34 +08:00 via iPhone
    Spring boot 和 http 请求有啥关系。。。
    ljhrot
        3
    ljhrot  
       2021-07-09 08:19:37 +08:00 via Android
    不如说说你为什么需要获取 HTML 请求报文?
    qwerthhusn
        4
    qwerthhusn  
       2021-07-09 08:31:28 +08:00   ❤️ 1
    这个是响应的一部分,跟请求体有毛关系。

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

    AbstractRequestLoggingFilter

    话说 2,4 8 楼略苛刻 , 真的要说的话..spring boot 处理 http 请求的是 spring-boot-starter-web, 好像和 spring boot 有点关系吧.
    MidCoder
        20
    MidCoder  
       2021-07-21 13:54:26 +08:00
    现在的开发真的是啥都不会呀?一上来就是 springboot,又是 springcloud 。啥 j2ee,jdbc 都不会了?原来至少 struts2 和 springmvc 还能感受一下底层,自从各种 boot 出现之后,大家应该都不知道 web.xml 里面长啥样了吧?建议还是沉下心来去看看基础,不要整天浮在各种框架之上,不然你永远不知道这个世界是怎么样的
    golangLover
        21
    golangLover  
       2021-07-26 09:15:36 +08:00 via Android
    @qwerthhusn 我觉得这个是正解,遇到的都是用过滤器的,没见过用拦截器的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2567 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:59 · PVG 12:59 · LAX 20:59 · JFK 23:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.