我想使用相当新的信标API。我搜索了网络,但找不到数据,发送数据的大小限制是多少。在它写的参考中,它意味着少量数据,但我必须知道有多少......
如果设置了最大大小,将取决于用户代理(浏览器或其他)。
见 http://www.w3.org/TR/beacon/#sec-sendBeacon-method
您可以通过创建可变长度N
字符串(从任意高的N
值开始,并使用二叉搜索)轻松地在网页中创建data
大小限制的测试,并检查sendBeacon
的返回值(根据规范,当超过用户代理数据限制时,sendBeacon
返回false
)。
例如,我使用此方法确认在Windows 40上的Chrome 7中限制为65536
(2^16
)。
示例代码(没有n
的二进制搜索):
var url = 'http://jsfiddle.net?sendbeacon';
var n = 65536; // sendBeacon limit for Chrome v40 on Windows (2^16)
// this method courtesy of http://stackoverflow.com/questions/14343844/create-a-string-of-variable-length-filled-with-a-repeated-character
var data = new Array(n+1).join('X'); // generate string of length n
if(!navigator.sendBeacon(url, data))
{
alert('data limit reached');
}
在评论中回答Zbun的问题:
简而言之,sendBeacon()
请求队列的总字节大小以及单个sendBeacon()
请求的有效负载大小都有限制。
正如在 nothingisrequired 的回答中提到的,W3C 规范说:
用户代理必须启动设置了keepalive标志的获取,这限制了此类请求可以排队的数据量,以确保信标请求能够快速及时地完成。
这仍然为每个实现留下实际字节大小限制,目前大多数浏览器通常为 64KB。
同样在相关的 GitHub 问题中,通过 Fetch API #39 强制执行有效负载限制,其中提到传输中有效负载的字节大小被计算在内并具有类似的限制。您可以查看 Chromium 的测试文件,了解 64KB 是 Chromium 的限制,并且与您指出的完全相同的行为(超出限制后的后续请求)是合适的。
https://chromium.googlesource.com/chromium/src/+/c1a211aa583ade023aca652e9493c01603623aa3/third_party/WebKit/LayoutTests/http/tests/sendbeacon/beacon-allowance-limit.html