java - 如何从 Java 中的 HttpServletRequest 检索原始帖子数据

标签 java http servlets post

我正在尝试用 Java 获取发布数据。似乎它应该是最简单的事情之一,对吗?我的意思是, HttpServletRequest.getParameter 必须做对吗?那么如何获取原始帖子数据呢?

我找到了 HttpServletRequest get JSON POST data并使用 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() 等也会隐式读取它。如果您以后需要分解参数,则必须将主体存储在某个地方并自己处理。

关于java - 如何从 Java 中的 HttpServletRequest 检索原始帖子数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5023718/

相关文章:

java - readObject() 之后的代码不运行

java - 在 JavaFX 中重新定位 Accordion 箭头

java - AtomicBoolean 与 volatile

node.js - 在 Node.js Express 中使用 HTTP 代理 HTTPS

java - ArrayIndexOutOfBoundsException 写入文件

http - Angular2.1 无法读取未定义的属性 'get'

java - Spring DispatcherServlet 与图像 Servlet 配置

java - 单击刷新 Servlet 页面显示重复内容

java - 在 Spring 中实现 If-Match HTTP header

java - 复合键的复合键