java - 无法读取格式为 application/json 的整个 POST 请求正文内容

标签 java jetty http-post

我在 Jetty 处理 application/json 格式的请求正文数据时遇到问题。本质上,当 Jetty 处理请求体时,请求数据就被切断了。

我有一个相对较大的 POST 正文,大约 74,000 字节。根据我在网上找到的一些建议,我实例化了一个新的上下文处理程序,并将 setMaxFormContentSize 属性设置为足够大的 500,000 字节。

    ServletContextHandler handler = new ServletContextHandler(server, "/");
    handler.setMaxFormContentSize(500000);

但是,这似乎无法正常工作。我还在网上读到,此属性可能仅适用于表单编码数据,不适用于 application/json,这是我们应用程序的严格要求。

有什么办法可以避免这个问题吗?是否有一些特殊的约束类,我可以对其进行子类化,以允许处理大小增加到至少 500KB?

编辑#1:我应该补充一点,我还尝试将限制的大小降低到 5 个字节,看看它是否会切断有效负载中的更多数据。这也不起作用,这似乎意味着这肯定完全忽略了该属性。

编辑#2:这是我从请求流中读取信息的地方。

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    try {
        String json = CharStreams.toString(new InputStreamReader(req.getInputStream()));
        ....
    } catch (Exception e) {
        logger.error("Exception in internal api forwarder", e);
        throw e;
    }
}

这似乎是从请求流读取的标准方法。我还尝试使用 req.getReader() 中的 BufferedReader 来解决同样的问题。

维韦克

最佳答案

这个 CharStreams 对象是什么?

它似乎不知道、不关心、也不尊重请求的字符编码。 (坏主意)

建议您使用servlet request.getReader()而不是 request.getInputStream() (实际上只为二进制请求正文内容设计)

使用 request.getReader() 至少可以正确支持您的请求字符编码。

您可能想要查看的另一条信息是 request.getContentLength()并验证请求 header 确实包含您期望的大小。

关于java - 无法读取格式为 application/json 的整个 POST 请求正文内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34620581/

相关文章:

java - 实现java鼠标监听器,自定义gui

java - 索引 : how to write document id to log? 期间的 SOLR RuntimeException

java - Spring Boot - 在处理请求正文时引入等待时间

javascript - 如何在 React JS 上通过 Ajax 发布新数据

java - 需要有关 Java、JPA、Thymeleaf 和 Mysql 的帮助

java - 如何在 java me 中有效地连接两个 vector 的数据?

java - Jetty 错误地报告状态 isRunning() 和 isFailed()

ruby - 使用 Ruby 的 Mechanize 登录时遇到问题

python - 使用 Python 在 Twitter 1.1 中发出仅应用程序请求

java - 使用 ID 引用将 JSON 实体反序列化为 POJO