【问题标题】:HTML SSE request bodyHTML SSE 请求正文
【发布时间】:2014-08-02 21:25:10
【问题描述】:

在 JavaScript 中使用 EventSource API 时,有什么方法可以将请求正文与发起轮询的 HTTP 请求一起发送?

我需要在 SSE 请求中向服务器发送大量 JSON,以便服务器可以计算要发送给客户端的事件。当我不需要它或使用 cookie 或多个请求做奇怪的事情时,做 web-sockets 似乎很愚蠢。

我担心如果我将数据捆绑到查询字符串中,我会遇到长度限制,这很可能发生。

提前致谢!

【问题讨论】:

  • 在没有代理的情况下,60kb 的数据非常适合 GET。我已经将 79.9k 放入 chrome 中。你可以用 DEFLATE 有效地翻倍。

标签: javascript html websocket server-sent-events


【解决方案1】:

初始的 SSE 请求是一个相当普通的 HTTP GET 请求,所以:

  • 鉴于 SSE 仅受现代浏览器支持,因此不应假定最大 URL 长度为“旧浏览器”的旧 255 字节。大多数现代浏览器允许更长的 URL,IE 提供的最低上限约为 2k。 (无论如何,IE 不支持授予的 EventSource,但有一个 XHR 填充...) 但是,如果大 blob 是指几千字节,则 URL 不可靠。代理也可能导致问题。

见: What is the maximum length of a URL in different browsers?, Is there any limitation on Url's length in Android's WebView.loadUrl method?, http://www.benzado.com/blog/post/28/iphone-openurl-limit

  • 您还可以将信息存储在一个或多个 cookie 中,这些 cookie 将与 GET 请求一起发送。这可能包括您在请求中为使用 SSE 的页面设置的 cookie,或者您在 javascript 中设置的 cookie(在创建 EventSource 对象之前)。 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 或编写 SSE 客户端JS?
  • 正确,new EventSource() 仅将 URL 作为参数,因此从官方 API 的角度来看,这是不可行的。自己构建 GET 请求非常简单,但解析输出却不是。
  • 可能黑客攻击可能基于规范中的以下注释:“获取算法的定义是,如果浏览器已经在获取由给定绝对 URL 标识的资源,则该连接可以被重用,而不是建立新的连接。在这种情况下,到目前为止收到的所有消息都会立即发送。需要进行测试以查看这是否意味着其他基于 EventSource 的请求或所有请求。
  • 是的,看起来很粗略,因为请求正文将有效地分隔事件,因此仅基于 URL 的重用会很奇怪。好的,如果时机成熟,我会转向 websockets。
猜你喜欢
  • 2021-10-07
  • 2017-07-10
  • 2012-10-15
  • 2018-01-21
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多