SpringBoot 如何获取原始请求体

2021-07-09 01:20:56 +08:00
 superdingdang

也就是这种:

HTTP/1.1  200  OK
Date: Mon, 10 Jul 2021 15:50:06 GMT
Content-Length: 256
Content-Type: text/html
3844 次点击
所在节点    Java
21 条回复
nvkou
2021-07-09 05:21:43 +08:00
到 controller 不都是 serverlet request 吗。全都包装好的
lululau
2021-07-09 07:38:34 +08:00
Spring boot 和 http 请求有啥关系。。。
ljhrot
2021-07-09 08:19:37 +08:00
不如说说你为什么需要获取 HTML 请求报文?
qwerthhusn
2021-07-09 08:31:28 +08:00
这个是响应的一部分,跟请求体有毛关系。

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

AbstractRequestLoggingFilter

话说 2,4 8 楼略苛刻 , 真的要说的话..spring boot 处理 http 请求的是 spring-boot-starter-web, 好像和 spring boot 有点关系吧.
MidCoder
2021-07-21 13:54:26 +08:00
现在的开发真的是啥都不会呀?一上来就是 springboot,又是 springcloud 。啥 j2ee,jdbc 都不会了?原来至少 struts2 和 springmvc 还能感受一下底层,自从各种 boot 出现之后,大家应该都不知道 web.xml 里面长啥样了吧?建议还是沉下心来去看看基础,不要整天浮在各种框架之上,不然你永远不知道这个世界是怎么样的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788414

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX