Java HttpServletRequest getParameter和getReader
我正在开发一个Java HttpServletRequest getParameter和getReader,java,servlets,Java,Servlets,我正在开发一个HttpServlet,它处理来自应用程序的POST请求,该应用程序在查询字符串中包含参数,在主体中包含JSON对象。它不是表单post,整个主体是JSON对象。我知道我需要使用HttpServletRequest.getReader()来阅读正文。但是我还需要使用HttpServletRequest.getParameter()来获取查询参数。我明白两者不能同时使用 我认为预期的解决方案是创建一个HttpServletRequestWrapper并重写getReader(),以允
HttpServlet
,它处理来自应用程序的POST请求,该应用程序在查询字符串中包含参数,在主体中包含JSON对象。它不是表单post,整个主体是JSON对象。我知道我需要使用HttpServletRequest.getReader()
来阅读正文。但是我还需要使用HttpServletRequest.getParameter()
来获取查询参数。我明白两者不能同时使用
我认为预期的解决方案是创建一个HttpServletRequestWrapper
并重写getReader()
,以允许多次调用它。但我不知道该怎么做。或许这不是我们想要的方法。我能找到的所有HttpServletRequestWrapper
示例似乎都与创建过滤器和修改请求内容有关
非常感谢您的帮助
顺便说一句,这是托管在Google App Engine上的,但我认为这不会影响解决方案。我认为您可以在
HttpServletRequestWrapper
中实现多个可调用的getReader()
:
HttpServletRequestWrapper.getReader()
时,打开临时文件要实现(1)和(3),
ServletFilter
可能很有用。我建议通过解析查询字符串直接读取查询字符串参数。这样,您就不会接触消息正文,并且可以使用HttpServletRequest.getReader()
解析查询字符串很棘手,但是可以使用Apache Http客户端包中的URLEncodedUtils安全地完成,如下所述:
getParameter()
javadoc POST参数作为请求正文发送的最后一段。因此,如果它们还没有被解析,而您读取了正文,那么您将无法使用getParameter()
,反之亦然。@BalusC:OP说参数在查询字符串中,而不是正文中(即,它们不是表单编码的)。当我说两者都不能使用时,我的意思是getReader()和getParameter()方法都不能使用。来自应用程序的帖子确实在querystring中发送了一些信息,并在正文中发送了一些主要信息。我将尝试getParameterMap()。因此,我尝试getParameterMap(),然后对键进行迭代,我注意到有一个键包含整个请求体。地图中的条目没有值。这有点奇怪,因为钥匙就是我想要的。但这似乎不是正确的方法。为了保存正文,我必须对底层HttpServletRequest调用getReader(),对吗?这意味着所有对getParameters()之类的调用现在都将失败。我必须自己解析所有参数、头和所有东西吗?