将大型响应 Json 作为多部分数据或多个部分发送

Posted

技术标签:

【中文标题】将大型响应 Json 作为多部分数据或多个部分发送【英文标题】:Send a large response Json as multipart-data or in multiple parts 【发布时间】:2018-07-27 02:36:35 【问题描述】:

我有一个要求,我有一个巨大的响应 json,其中包含作为 base64 数据传递到 json 中的图像。 json 中有许多这样的 base64 字符串数据,每个都很大,因为这些图像的大小也是 5-10 Mb。因此 json 大小变大。我想知道是否有任何方法可以将这个巨大的 json 转换为多部分数据,或者是否有任何方法可以打破这个巨大的响应 json 并在单个 http 请求中分多个部分发送它们。任何人都可以在上面提供一些帮助。

【问题讨论】:

这个问题可能太宽泛了。你能具体说明什么是你可以接受的权衡吗?例如。是否将响应内容类型更改为 MIME/Multipart 选项?提供图像链接而不是图像本身是一种选择吗?有很多可能性,但你最好编辑你的问题,并清楚什么可以接受或不可以接受。 是的,我想将响应作为多部分发送,所以响应内容类型将是 MIME/Multipart。不,我没有将图片作为链接发送的选项。我必须将它作为 base64 本身发送。 【参考方案1】:

一些选项,但可能最容易使用 Jackson,Java 的 JSON 解析器。 Jackson 可以将一个大的 JSON 对象拆分成多个较小的对象,这些对象可以发送到客户端。这是tutorial。

有关其他选项,请参阅此 Stack Overflow response。

【讨论】:

感谢@tskittles 的回复。是的,我们可以拆分 json,但是在将它们拆分为多个较小的对象之后,如何发送这个大的 json 作为响应。这个大 json 需要在单个 http 事务中发送。 如果您想在单个 http 事务中发送 JSON,那么拆分 JSON 的意义何在?无论如何,不​​可能发送多个 JSON 对象,因为 HTTP 响应只有一个正文。 是的,这就是为什么我问是否有办法将 json 转换为多部分数据,以便我可以在单个响应中发送它。【参考方案2】:

我对你的问题有疑问。您想拆分巨大的响应 json,但仍需要一个请求。在 HTTP 协议级别,一个请求意味着一个响应。然后,您可以使用不同的容器格式以您想要的方式嵌套数据,它不会神奇地拆分响应,只会增加一些开销。

您确实有低协议级别的选项。一种是压缩响应负载。只要浏览器支持,许多框架和 servlet 容器都可以做到这一点,现在所有主流浏览器都支持。另一种是chunk响应负载。在更高级别上,它仍然是一个单一的字节流,但它在网络上以不同的发送。它可能更健壮,具体取决于网络,主要是在您使用多个代理或路由器时。

另一个选项是高级别的:让客户端发出一堆请求,每个响应都包含大 json 的一部分。

【讨论】:

以更简单的方式,如何通过 http 发送巨大的 json 响应。当我直接发送它时,由于它的体积很大,很多次响应都失败了。这就是为什么我想去多部分数据。无论如何,你能建议一种低丢弃率的方法来通过 http 发送一个巨大的 json 作为响应。 @AkashRaveendran:这就是 chunking 的用途。您真的应该深入研究您的系统,以搜索如何以块的形式发送巨大的响应。 Google for chunk 和你的 servlet 包含框架。 好的。我会调查你所说的chunking。谢谢。

以上是关于将大型响应 Json 作为多部分数据或多个部分发送的主要内容,如果未能解决你的问题,请参考以下文章

ajax 将多部分表单数据作为 json 对象上传

如何发送 JSON 作为多部分 POST 请求的一部分

带有多部分请求的 Spring Boot 不受支持的媒体类型

骨干可以作为多部分发送数据吗?

如何将树枝呈现的模板作为 JSON 响应的一部分返回?

当内容类型为“text/xml”时,Axis2 发送多部分响应