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

时间:2016-01-05 20:23:35

标签: 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;
    }
}

这似乎是从请求流中读取的标准方式。我还尝试使用来自BufferedReader的{​​{1}}同样的问题。

的Vivek

1 个答案:

答案 0 :(得分:1)

这个CharStreams对象是什么?

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

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

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

您可能希望查看的另一部分信息是request.getContentLength(),并验证请求标头确实包含您期望的大小。