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

SpringBoot 如何获取原始请求体

  •  
  •   superdingdang · 107 天前 · 2208 次点击
    这是一个创建于 107 天前的主题,其中的信息可能已经有所发展或是发生改变。

    也就是这种:

    HTTP/1.1  200  OK
    Date: Mon, 10 Jul 2021 15:50:06 GMT
    Content-Length: 256
    Content-Type: text/html
    
    第 1 条附言  ·  106 天前
    抱歉,上面那串 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   107 天前 via Android
    到 controller 不都是 serverlet request 吗。全都包装好的
    lululau
        2
    lululau   107 天前 via iPhone
    Spring boot 和 http 请求有啥关系。。。
    ljhrot
        3
    ljhrot   107 天前 via Android
    不如说说你为什么需要获取 HTML 请求报文?
    qwerthhusn
        4
    qwerthhusn   107 天前   ❤️ 1
    这个是响应的一部分,跟请求体有毛关系。

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

    AbstractRequestLoggingFilter

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