2016-06-21 62 views
3

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

回答

6

HTTP/2并不是用来代替websockets,因为你提出了一个请求(例如一个网页),并且可能会获得一些资源(例如,网页,显示网页所需的CSS,需要的JavaScript运行该网页...等)。

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

所以如果你打算发送JSON请求来响应初始请求,那很好 - 它只是另一个资源,就像CSS和JavaScript一样。

但是,如果您打算继续打开频道以不断发送更多JSON有效内容以使您的页面保持最新状态,那么这不是HTTP/2的目标。这就是websockets的用途。

这个问题有相对的WebSockets对HTTP/2的一些进一步的细节:Does HTTP/2 make websockets obsolete?

+0

[这个答案](https://stackoverflow.com/a/42465368/861209)的问题[是否HTTP/2使WebSockets的过时了吗?](https://stackoverflow.com/questions/28582935/does-http-2-make-websockets-obsolete)说:“我认为HTTP/2对大多数使用情况都会过时的websockets,但可能并非全部”,并且“...... HTTP/2是否能更好地启用浏览器中的双向流式传输,我认为是的,它确实是“。 –

+0

这是推动HTTP/2超出其初衷的一种有趣的方式,并且可能在某些情况下工作(gRPC是这种应用程序的一个有趣的概念版本),但是我认为它对于大多数应用程序来说可能是矫枉过正,而与较轻的websocket风格实现。同样,这一切都必须建立在HTTP/2之上,因此,回到原来的问题,在初始响应之后,没有简单的方法可以在任何HTTP/2客户端或服务器实施中本地推送动态有效载荷,例如JSON文档。 –

+0

那么我应该说“任何当前的HTTP/2客户端和服务器实现,我知道”:-) –

0

是的,你可以使用HTTP/2推派任何类型的资产。但请记住以下几点:

  • 由于BazzaDP说,HTTP/2 Push is not a push notification mechanism。但HTTP/2非常适合做长轮询,然后你有内容编码压缩,加密,HTTP头和流量控制,所以对于90%的情况,你可以并可能应该跳过websockets。请注意,进行长轮询时,HTTP/2 Push不是必需的。另外请注意,有一些名称为Server Sent Events的类型是浏览器支持的长轮询版本。

  • 对于应用程序而言,HTTP/2推送是非常透明的。这意味着您必须执行推送请求您的应用程序中的资源。

  • 现在,只有可缓存的内容才可用于应用程序。这意味着您需要在动态生成的JSON响应中设置缓存标头。大概你可以设置一个短暂的到期时间,或者一个很长的时间,但是在一个动态的URL下。