如何处理 post 大小超过 2 mb 的数据

How to handle post data of size more than 2 mb

我有 json post 具有以下模板的数据

 {

    "themeId" : JSONString,
    "themeName" : JSONString,
    "tables" : [{
        "tableName" : JSONString,
        "records" : [{
            "recordVersion" : JSONString,
            "tableItems" : [] 
        }]
    }]

}

在 Java 方面我有 REST API 这样的:

@POST
@Path("/{themeId}")
@Consumes({MediaType.APPLICATION_JSON})
public Response postTheme( @PathParam("themeId") String themeId, ThemeDictionary dictionary) throws InterruptedException {
    //code to handle
}

当 post 数据小于 2 MB 时工作正常,但如何处理大于 2 MB 的数据。

问题

1) 我应该使用分页吗?

2) 如果我将 json 分成两半,那么每一半都将无效 json。那么,我应该在服务器端接受字符串并连接吗?

3) 有什么很好的例子可以处理这种情况

4) 寻找可以处理 json 大小小于或大于 2 MB 的数据的方法

2MB 相当小,我认为将 json 文件作为多部分上传,然后正常处理 json 文件的方法最多可以处理 50MB 大小的文件。可以找到处理文件上传的示例 here.

对于json个超过百MB的文件,我们必须想办法在流中处理,或者将文件拆分成更小的文件。

分页将是不错的选择,但需要手动干预。 取而代之的是,您可以发送多个异步请求来获取数据(即,在一个请求中获取 1-200 条记录,下一个请求将获取 200-400 条记录),但不推荐这样做,因为您的服务器将根据记录数。

分页不会解决您的问题,因为您正在向服务器发送数据,而不是接收数据。

您使用什么 servlet 容器?看起来像默认 tomcat POST 限制大小。

如果您使用的是单机版 tomcat 您需要设置参数 您的连接器的maxPostSizesee here or (here)

Json 文件非常适合压缩。你应该考虑一下。

是的,您应该使用分页。但是会有一些缺点。比如一致性。

您应该以不分成字符串的方式发送它们。我建议你发送有意义的数据。所以分页将是有意义的。如果消息的一部分(块)丢失,您应该只重新发送该部分。不是全部。

"how can you eat a really big fish? - by slicing thin"。

尝试 post 更小且有意义的部分。否则你的服务器将需要更多的计算时间来处理数据,你的客户端需要更多的内存来处理。

您有什么理由不在一个请求中发送数据吗?将 50MB 作为一个请求发送。 JSON 或 HTTP post 规范中的数据大小没有限制,如以下 SO 问题

中所述

Is there a limit on how much JSON can hold?

如果您担心服务器的性能。一种可能的选择是从逻辑上拆分 json,以便可以在较小的块中执行操作。

例如,考虑到您的表数组中有 200 个项目,您可以考虑将表数组拆分为更小的块,比如每个请求 50 /20。

{

    "totalPages":2,
    "themeId" : JSONString,
    "themeName" : JSONString,
    "tables" : [{
        //first 50 tables
        "tableName" : JSONString,
        "records" : [{
            "recordVersion" : JSONString,
            "tableItems" : [] 
        }]
    }]

}

下一个请求

{
    "totalPages":2,
    "themeId" : JSONString,
    "themeName" : JSONString,
    "tables" : [{
        //next 50 tables
        "tableName" : JSONString,
        "records" : [{
            "recordVersion" : JSONString,
            "tableItems" : [] 
        }]
    }]

}

如果您不需要完整的数据来处理请求,您可以在数据到达时对其执行操作。如果没有,将表数组添加到一些 db/file/memory 直到收到最后一页,并且对于最后一个请求将 json 合并回一起并处理请求并发回正确的响应。如果是第二种情况,性能提升不大。