HTML SSE 请求体

10
在使用JavaScript中的EventSource API时,是否有任何方法可以在发起轮询的HTTP请求中发送请求正文?
我需要在SSE请求时向服务器发送一个大的JSON块,以便服务器可以计算要发送给客户端的事件。如果在不需要的情况下使用WebSockets或使用Cookie或多个请求做奇怪的事情似乎很愚蠢。
如果将数据捆绑到查询字符串中,则可能会遇到长度限制问题,这让我感到担忧。
提前谢谢!

不使用代理,60kb的数据可以轻松地适应GET请求。我已经在Chrome中传输了79.9k。您可以通过DEFLATE有效地将其加倍。 - dandavis
1个回答

7

SSE的初始请求是相当普通的HTTP GET请求,因此:

  • 考虑到SSE仅受现代浏览器支持,不应假定URL的最大长度为旧浏览器的255字节。大多数现代浏览器允许更长的URL,IE提供的容量最低约为2k。(尽管EventSource在IE上不受支持,但有XHR polyfill...)但是,如果您指的是几千字节的大数据块,则URL不可靠。代理也可能会引起问题。

参见: 不同浏览器URL的最大长度是多少?, Android's WebView.loadUrl方法中的Url长度是否有限制?, http://www.benzado.com/blog/post/28/iphone-openurl-limit

  • 您还可以将信息存储在一个或多个cookie中,并随GET请求一起发送。这可以包括您在使用SSE的页面的请求上设置的cookie,或者您在创建EventSource对象之前在javascript中设置的cookie。 cookie的最大大小被指定为至少4096字节(这是整个cookie,因此实际数据部分要少一些),每个主机名支持至少20个cookie。经验测试似乎证明了这一点:http://browsercookielimits.x64.me/ 在最坏的情况下,您可能需要将信息分成多个cookie。

  • 如果超过此大小,我认为您需要一个初始请求,该请求上传JSON并返回SSE请求引用的ID。

  • 在技术上,发送带有GET请求体是可能的,但(强烈)不鼓励。请参见HTTP GET with request body。EventSource构造函数仅接受URL,因此不直接支持此功能。

  • 正如dandavis指出的那样,您可以压缩JSON。


那么,如果我想违背建议,将有效载荷发送到请求正文中(我可能不会这样做),那么我需要修改EventSource的polyfil或在JS中编写SSE客户端? - Aiden Bell
正确,new EventSource()只接受一个URL作为参数,因此从官方API的角度来看,这是不可行的。自己构建GET请求非常简单,但解析输出却不是那么容易。 - Jason S
可能的黑客攻击可能基于规范中的以下注释:“获取算法的定义是,如果浏览器已经获取给定绝对URL标识的资源,则可以重用该连接,而不是建立新连接。在这种情况下,所有接收到的消息都会立即分派。”需要进行测试以确定这是否意味着仅限其他基于“EventSource”的请求,还是所有请求。 - Jason S
是的,似乎有些可疑,因为请求正文将有效地分隔事件,所以仅基于URL的重用将很奇怪。好的,如果时机成熟,我会转向WebSockets。 - Aiden Bell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接