在 JavaScript 中使用 EventSource API 时,有什么方法可以将请求正文与发起轮询的 HTTP 请求一起发送吗?
我需要在 SSE 请求时向服务器发送一大块 JSON,以便服务器可以计算要发送给客户端的事件。在我不需要时使用网络套接字或使用 cookie 或多个请求做奇怪的事情似乎很愚蠢。
我担心如果我将数据捆绑到查询字符串中,我会遇到查询字符串的长度限制,这很有可能。
提前致谢!
最佳答案
初始 SSE 请求是一个相当普通的 HTTP GET 请求,因此:
- 鉴于 SSE 仅受现代浏览器支持,不应将最大 URL 长度假设为“用于旧浏览器”的旧 255 字节。大多数现代浏览器允许更长的 URL,IE 提供 ~2k 的最低上限。 (无论如何,IE 不支持 EventSource,但有一个 XHR polyfill...)但是,如果大 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。
关于javascript - HTML SSE 请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099548/