当前位置: 首页 > 面试题库 >

如何在Java中从HttpServletRequest检索原始发布数据

拓拔霄
2023-03-14
问题内容

我正在尝试获取Java中的发布数据。好像应该做的最简单的事情之一?我的意思是,HttpServletRequest.getParameter必须正确执行吗?那么,如何获取原始帖子数据?

我发现HttpServletRequest获得JSONPOST数据,并使用Kdeveloper的代码从请求中提取发布数据。它有效,但是有一个陷阱:我只能 一次 获取该发布数据。

这是我根据Kdeveloper的代码制作的方法:

public static String getPostData(HttpServletRequest req) {
    StringBuilder sb = new StringBuilder();
    try {
        BufferedReader reader = req.getReader();
        reader.mark(10000);

        String line;
        do {
            line = reader.readLine();
            sb.append(line).append("\n");
        } while (line != null);
        reader.reset();
        // do NOT close the reader here, or you won't be able to get the post data twice
    } catch(IOException e) {
        logger.warn("getPostData couldn't.. get the post data", e);  // This has happened if the request's reader is closed    
    }

    return sb.toString();
}

以前,我在此方法结束时关闭了读取器,但是当该方法在同一请求上多次运行时,会导致异常。如果不关闭它,则不会发生任何异常,但是该方法将返回一个空字符串。

老实说,应该只提供一个公开的req.getPostData()方法-没有人认为这会有用吗?

那么,如何编写此方法,使其始终返回正确的发布数据?


问题答案:

请求主体可通过HttpServletRequest#getInputStream()以下方式作为字节流使用:

InputStream body = request.getInputStream();
// ...


通过HttpServletRequest#getReader()以下方式作为字符流:

Reader body = request.getReader();
// ...

请注意,您只能阅读一次。客户端不会多次重发相同的请求。调用getParameter()等等也将隐式读取它。如果以后需要分解参数,则必须将主体存储在某个地方并自行处理。



 类似资料:
  • 我知道,如果我不穿运动衫,这是一件很容易的事,我会用这样的东西: 我也意识到我可以做到这一点,并完成它。 但是,如果我真的想转储通过POST提交的表单的所有内容,该怎么办? 问题是,我使用Jersey作为JAX-RS的实现,并使用上面的代码输出以下内容: 我猜想我的数据包含在这里:不过我不确定jaxrsquestattributes。 我知道我错过了一些东西。这应该不难吧? 更新 正如索蒂里奥斯所

  • 我的Rest控制器 我的异常处理无效的原始 json 帖子。我尝试使用请求。 IllegalStateException:已经为此请求调用了getInputStream() 我想在这个异常上保留日志输入原始json数据。 有人能帮我吗?谢谢。 更新 作为@Sean Carrol的建议。我尝试按照建议使用HttpServletRequest estWrapper,但它仍然不起作用。 我在InputS

  • 问题内容: 我希望将原始的发布数据(例如,未参数化的JSON)发送到我的一个控制器进行测试: 但这给我一个symbolize_keys’ for 用什么发送原始帖子数据的正确方法是什么? 这是一些控制器代码: 问题答案: 我今天遇到了同一问题,找到了解决方案。 在您的内部定义以下方法: 在功能测试中,与方法一样使用它,但将原始文章正文作为第三个参数传递。 我在Rails 2.3.4上使用读取原始文

  • 问题内容: 我尝试将一些数据发布到Wicket网页。如果数据采用表格形式,则效果很好。但是,我想用jQuery的ajax- post发布数据。我无法在我的Page构造函数中获取此数据。 这是我的jquery命令: / testjson是已安装的WebPage。 这是构造函数。我看到的是输入流为空。然而,在调试的时候,我看到了原始数据,我在贴在我的 tl; dr 如何在Wicket页面中获取原始帖子

  • 问题内容: 我的PCM样本很短。发挥这种效果的最佳方法是什么?格式为8000Hz,单声道,16位,大字节序。(PCM样本是在代码中生成的,而不是通过某些文件读取的) 谢谢 问题答案: 使用javax.sound.sampled包,它非常简单,但是您必须使用一些样板文件。 这是一个很好的教程:www.wikijava.org/wiki/Play_a_wave_sound_in_Java 基本上,您必