HTTP/2 推送 JSON 负载

Posted

技术标签:

【中文标题】HTTP/2 推送 JSON 负载【英文标题】:HTTP/2 Push JSON Payload 【发布时间】:2016-10-23 14:34:41 【问题描述】:

http/2 服务器推送的最常见用例是抢先将资产文件(如 javascript 和 css 文件)推送到浏览器。我想知道可以使用 http/2 服务器推送将动态有效负载(例如 JSON 文档)发送到客户端应用程序吗?从http2-spec,它没有提到任何关于此的内容。任何人都可以详细说明这一点吗?为什么或为什么不?

【问题讨论】:

【参考方案1】:

HTTP/2 不打算作为 websockets 的替代品,因为您发出请求(例如网页)并可能获取多个资源(例如网页、显示网页所需的 CSS、运行所需的 JavaScript那个网页……等等)。

因此,HTTP/2 并不是真正的双向,因为它仍然响应初始请求。

因此,如果您打算发送 JSON 请求以响应初始请求,那很好 - 它只是与 CSS 和 javascript 大致相同的另一种资源。

但是,如果您打算保持通道打开以不断发送更多 JSON 有效负载以使您的页面保持最新状态,那么这不是 HTTP/2 的目的。这就是 websocket 的用途。

这个问题有更多关于 HTTP/2 与 websockets 的细节:Does HTTP/2 make websockets obsolete?

【讨论】:

This answer 对问题Does HTTP/2 make websockets obsolete? 说“我认为对于大多数用例来说,HTTP/2 确实过时了 websockets,但可能不是全部”并且进一步“...... HTTP/2 是否更好地在浏览器中启用双向流媒体,我认为是的,确实如此。 这是推动 HTTP/2 超越其初衷的一种有趣方式,并且可能在某些场景中工作(gRPC 是此类应用程序的一个有趣的概念版本),但我想说这对大多数人来说可能是矫枉过正应用程序与更轻的 websocket 样式实现相比。此外,这一切都必须建立在 HTTP/2 之上,因此,回到最初的问题,在初始响应之后,没有简单的方法可以在任何 HTTP/2 客户端或服务器实现中本地推送动态有效负载(例如 JSON 文档) . 好吧,我应该说“我知道的任何当前的 HTTP/2 客户端和服务器实现”:-)【参考方案2】:

是的,您可以使用 HTTP/2 Push 发送任何类型的资产。但请记住以下几点:

正如 BazzaDP 所说,HTTP/2 Push is not a push notification mechanism。但是 HTTP/2 非常适合进行长轮询,然后您拥有内容编码压缩、加密、HTTP 标头和流控制,因此对于 90% 的情况,您可以而且可能应该跳过 websockets。请注意,在进行长轮询时,不需要 HTTP/2 推送。另请注意,有一个名为 Server Sent Events 的东西是浏览器认可的长轮询版本。

到目前为止,HTTP/2 推送对应用程序是透明的。这意味着您必须执行 Push 从您的应用程序请求资源。

目前,只有可缓存的内容可供应用程序使用。这意味着您需要在动态生成的 JSON 响应中设置 cache headers。可能您可以设置一个较短的过期时间,或者一个较长的过期时间,但在动态 URL 下。

【讨论】:

以上是关于HTTP/2 推送 JSON 负载的主要内容,如果未能解决你的问题,请参考以下文章

GCM 未在通知中使用来自 JSON 有效负载的数据

收到无效的 JSON 有效负载。未知名称 click_action

iOS VoIP 推送负载是不是类似于静默通知的负载?

c# 中的 Apple 推送通知服务代码服务器端

iOS8 和 iOS7 推送通知负载

推送通知使用有效负载打开正确的页面