springbootboot-HttpServletRequest.getInputStream() 获取post内容

Posted youlixishi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springbootboot-HttpServletRequest.getInputStream() 获取post内容相关的知识,希望对你有一定的参考价值。

问题描述:

php端用curl post一段json到java springboot。在java端用request.getInputStream()获取到的数据为空。

 

问题确认:

询问度娘后, 她告诉我:

根据Servlet规范,如果同时满足下列条件,则请求体(Entity)中的表单数据,将被填充到request的parameter集合中(request.getParameter系列方法可以读取相关数据):
1 这是一个HTTP/HTTPS请求
2 请求方法是POST(querystring无论是否POST都将被设置到parameter中)
3 请求的类型(Content-Type头)是application/x-www-form-urlencoded
4 Servlet调用了getParameter系列方法

from:http://bbs.csdn.net/topics/390833946

抓包发现,php发送的post请求符合 以上规范。 好吧, 就是因为这样, 导致request.getInputStream()获取不到数据,因为getInputStream()流中的数据被读被框架放到 request 的paramter相关变量中去了, 并且一旦放置成功,getInputStream()流中的数据将被清空。(猜测: 其实是流读取到最后, 没有被重置。吐槽spring/java: .net中至少流是可以设置读取 指针指向0, 则可以重新读取流了好吧。)

 

解决办法:

在读取post参数时, 如果getInputStream()读取为空,则从getParameterMap()中读取。(再次吐槽: 参数居然是key, 不是value???)

 

思考:

我真的好想你, .net

 

以上是关于springbootboot-HttpServletRequest.getInputStream() 获取post内容的主要内容,如果未能解决你的问题,请参考以下文章