将大型响应 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 作为多部分数据或多个部分发送的主要内容,如果未能解决你的问题,请参考以下文章