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()

  • 将HTTP请求正文保存到临时文件中
  • 调用
    HttpServletRequestWrapper.getReader()
    时,打开临时文件
  • 在请求处理结束时删除临时文件

  • 要实现(1)和(3),
    ServletFilter
    可能很有用。

    我建议通过解析查询字符串直接读取查询字符串参数。这样,您就不会接触消息正文,并且可以使用
    HttpServletRequest.getReader()

    解析查询字符串很棘手,但是可以使用Apache Http客户端包中的URLEncodedUtils安全地完成,如下所述:


    “我明白这两种方法都不能使用”。。。事实并非如此。你可以毫无问题地使用两者。@skaffman:这不是真的。阅读
    getParameter()
    javadoc POST参数作为请求正文发送的最后一段。因此,如果它们还没有被解析,而您读取了正文,那么您将无法使用
    getParameter()
    ,反之亦然。@BalusC:OP说参数在查询字符串中,而不是正文中(即,它们不是表单编码的)。当我说两者都不能使用时,我的意思是getReader()和getParameter()方法都不能使用。来自应用程序的帖子确实在querystring中发送了一些信息,并在正文中发送了一些主要信息。我将尝试getParameterMap()。因此,我尝试getParameterMap(),然后对键进行迭代,我注意到有一个键包含整个请求体。地图中的条目没有值。这有点奇怪,因为钥匙就是我想要的。但这似乎不是正确的方法。为了保存正文,我必须对底层HttpServletRequest调用getReader(),对吗?这意味着所有对getParameters()之类的调用现在都将失败。我必须自己解析所有参数、头和所有东西吗?