【发布时间】:2016-10-23 14:34:41
【问题描述】:
http/2 服务器推送的最常见用例是抢先将资产文件(如 javascript 和 css 文件)推送到浏览器。我想知道可以使用 http/2 服务器推送将动态有效负载(例如 JSON 文档)发送到客户端应用程序吗?从http2-spec,它没有提到任何关于此的内容。任何人都可以详细说明这一点吗?为什么或为什么不?
【问题讨论】:
标签: http2 server-push
http/2 服务器推送的最常见用例是抢先将资产文件(如 javascript 和 css 文件)推送到浏览器。我想知道可以使用 http/2 服务器推送将动态有效负载(例如 JSON 文档)发送到客户端应用程序吗?从http2-spec,它没有提到任何关于此的内容。任何人都可以详细说明这一点吗?为什么或为什么不?
【问题讨论】:
标签: http2 server-push
HTTP/2 不打算作为 websockets 的替代品,因为您发出请求(例如网页)并可能获取多个资源(例如网页、显示网页所需的 CSS、运行所需的 JavaScript那个网页……等等)。
因此,HTTP/2 并不是真正的双向,因为它仍然响应初始请求。
因此,如果您打算发送 JSON 请求以响应初始请求,那很好 - 它只是与 CSS 和 javascript 大致相同的另一种资源。
但是,如果您打算保持通道打开以不断发送更多 JSON 有效负载以使您的页面保持最新状态,那么这不是 HTTP/2 的目的。这就是 websocket 的用途。
这个问题有更多关于 HTTP/2 与 websockets 的细节:Does HTTP/2 make websockets obsolete?
【讨论】:
是的,您可以使用 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 下。
【讨论】: