31

我正在使用 Html5 服务器发送事件。服务器端是 Java Servlet。我有一个 json 数组数据想要传递给服务器。

var source = new EventSource("../GetPointVal?id=100&jsondata=" + JSON.stringify(data));

如果数组大小很小,则服务器端可以获取查询字符串。但是如果数组大小很大。(可能超过数千个字符),服务器无法获取查询字符串。是否可以使用 POST 方法new EventSource(...)将 json 数组传递给可以避免查询字符串长度限制的服务器?

4

3 回答 3

36

不,SSE 标准不允许 POST。

(没有技术原因,据我所知 - 我认为只是设计师从未见过用例:它不仅仅是大数据,而且如果你想做一个自定义的身份验证方案,有不将密码放入 GET 数据中的安全原因。)

XMLHttpRequest(即 AJAX)确实允许 POST,因此一种选择是回到旧的长轮询/彗星方法。(我的书,带有 HTML5 SSE 的数据推送应用程序详细介绍了如何做到这一点。)

另一种方法是POST预先将所有数据存储在一个HttpSession中,然后调用 SSE 进程,该进程可以利用该会话数据。(SSE 确实支持 cookie,所以JSESSIONIDcookie 应该可以正常工作。)

PS 该标准没有明确说明不能使用 POST。但是,与 不同XMLHttpRequest的是,没有参数来指定要使用的 http 方法,也无法指定要发布的数据。

于 2015-12-15T09:32:58.190 回答
6

虽然您不能使用EventSourceAPI 来执行此操作,但服务器无法实现 POST 请求并没有技术原因。诀窍是让客户端发送请求。例如这个答案讨论 sse.js作为 .js 的替代品EventSource

于 2019-02-27T18:12:43.990 回答
0

或者,您可以从使用另一个 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>
于 2018-11-15T06:58:56.630 回答