带有 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.

的替代品