带有 EventSource 的服务器发送事件 (SSE) 能否通过 POST 传递参数
Can Server Sent Events (SSE) with EventSource pass parameter by POST
我正在使用 Html5 服务器发送的事件。服务器端是 Java Servlet。
我有一个 json 数组数据要传递给服务器。
var source = new EventSource("../GetPointVal?id=100&jsondata=" + JSON.stringify(data));
如果数组较小,服务器端可以获取查询字符串。
但是如果数组大小很大。 (可能超过数千个字符),服务器无法获取查询字符串。
是否可以使用 new EventSource(...)
中的 POST 方法将 json 数组传递给服务器,从而避免查询字符串长度限制?
不行,SSE标准不允许POST。
(没有技术原因,据我所知 - 我认为这只是设计人员从未见过用例:它不仅仅是大数据,但如果你想做一个自定义身份验证方案出于安全原因不将密码放在 GET 数据中。)
XMLHttpRequest
(即 AJAX)确实允许 POST,因此一种选择是回到旧的 long-poll/comet 方法。 (我的书 Data Push Apps with HTML5 SSE 详细介绍了如何执行此操作。)
另一种方法是预先POST
所有数据,并存储在一个HttpSession
中,然后调用SSE进程,它可以利用该会话数据。 (SSE 确实支持 cookie,因此 JSESSIONID
cookie 应该可以正常工作。)
P.S。 standard 没有明确说明 POST 不能使用。但是,与 XMLHttpRequest
不同的是,没有指定要使用的 http 方法的参数,也没有办法指定要 post.
的数据
或者,您可以从您使用另一个自定义的文件中读取数据 php
http://..../command_receiver.php?command=blablabla
command_receiver.php
<?php
$cmd = $_GET['command'];
$fh = fopen("command.txt","w");
fwrite($fh, $cmd);
fclose($fh);
?>
demo2_sse.php
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
//$a = $_GET["what"];
$time = microtime(true); //date('r');
$fa = fopen("command.txt", "r");
$content = fread($fa,filesize("command.txt"));
fclose($fa);
echo "data: [{$content}][{$time}]\n\n";
flush();
?>
并且EventSource被包含在一个任意命名的html中,如下
<!DOCTYPE html>
<html>
<body>
<h1>Getting server updates</h1>
var source = new EventSource("demo2_sse.php");
source.onmessage = function (event) {
mycommand = event.data.substring(1, event.data.indexOf("]"));
mytime = event.data.substring(event.data.lastIndexOf("[") + 1, event.data.lastIndexOf("]"));
}
</script>
</body>
</html>
虽然您不能使用 EventSource
API 来执行此操作,但没有技术原因导致服务器无法实现 POST 请求。诀窍是让客户端 发送 请求。例如 This answer discusses sse.js 作为 EventSource
.
的替代品
我正在使用 Html5 服务器发送的事件。服务器端是 Java Servlet。 我有一个 json 数组数据要传递给服务器。
var source = new EventSource("../GetPointVal?id=100&jsondata=" + JSON.stringify(data));
如果数组较小,服务器端可以获取查询字符串。
但是如果数组大小很大。 (可能超过数千个字符),服务器无法获取查询字符串。
是否可以使用 new EventSource(...)
中的 POST 方法将 json 数组传递给服务器,从而避免查询字符串长度限制?
不行,SSE标准不允许POST。
(没有技术原因,据我所知 - 我认为这只是设计人员从未见过用例:它不仅仅是大数据,但如果你想做一个自定义身份验证方案出于安全原因不将密码放在 GET 数据中。)
XMLHttpRequest
(即 AJAX)确实允许 POST,因此一种选择是回到旧的 long-poll/comet 方法。 (我的书 Data Push Apps with HTML5 SSE 详细介绍了如何执行此操作。)
另一种方法是预先POST
所有数据,并存储在一个HttpSession
中,然后调用SSE进程,它可以利用该会话数据。 (SSE 确实支持 cookie,因此 JSESSIONID
cookie 应该可以正常工作。)
P.S。 standard 没有明确说明 POST 不能使用。但是,与 XMLHttpRequest
不同的是,没有指定要使用的 http 方法的参数,也没有办法指定要 post.
或者,您可以从您使用另一个自定义的文件中读取数据 php
http://..../command_receiver.php?command=blablabla
command_receiver.php
<?php
$cmd = $_GET['command'];
$fh = fopen("command.txt","w");
fwrite($fh, $cmd);
fclose($fh);
?>
demo2_sse.php
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
//$a = $_GET["what"];
$time = microtime(true); //date('r');
$fa = fopen("command.txt", "r");
$content = fread($fa,filesize("command.txt"));
fclose($fa);
echo "data: [{$content}][{$time}]\n\n";
flush();
?>
并且EventSource被包含在一个任意命名的html中,如下
<!DOCTYPE html>
<html>
<body>
<h1>Getting server updates</h1>
var source = new EventSource("demo2_sse.php");
source.onmessage = function (event) {
mycommand = event.data.substring(1, event.data.indexOf("]"));
mytime = event.data.substring(event.data.lastIndexOf("[") + 1, event.data.lastIndexOf("]"));
}
</script>
</body>
</html>
虽然您不能使用 EventSource
API 来执行此操作,但没有技术原因导致服务器无法实现 POST 请求。诀窍是让客户端 发送 请求。例如 This answer discusses sse.js 作为 EventSource
.