是否可以像在Ajax中那样使用SSE将POST数据发送到PHP?
我已经使用AJAX很长一段时间了,在长时间的轮询技术中结果很糟糕。我也一直在考虑WebSockets,但它似乎有点多余。
否,SSE无法向服务器发送任何数据。
您仍然可以使用SSE实时读取数据,并使用AJAX上传任何数据(您可能需要一个共享数据库来在AJAX接收进程和SSE发送进程之间传递信息)。
您可以通过GET发送数据。
例如
name=john&name=lea
这是一个简单的脚本,它使用SSE向服务器发送迭代次数和服务器返回进度。
这个项目由两个文件(index.php和ssedemo.php)组成
index.php包含一个文本框和一个按钮。文本框假定包含ssedemo.php 中循环的迭代次数
<h2>Server Sent Event Test</h2>
<form>
<label>Process Duration</label>
<input type="text" id="progVal">
<input type="button" value="Get Messages" onclick="updateProgress()"/>
</form>
<div id="container">
</div>
更新进度
function updateProgress() {
var input = $('#progVal').val();
var evtSource = new EventSource("ssedemo.php?duration=" + encodeURIComponent(input));
evtSource.addEventListener("progress", function (e) {
var obj = JSON.parse(e.data);
$('#container').html(obj.progress);
if( parseInt(obj.progress) == 100){
evtSource.close();
}
}, false);
}
此函数使用jQuery获取文本框的内容,然后创建一个eventSource。EventSource()构造函数接受一个或两个参数。第一个指定要连接的URL。第二个以EventSourceInit字典的形式指定设置(如果有的话)。
您可以像使用GET一样,通过将其添加到URL来传递您想要的内容。
"ssedemo.php?duration=" + encodeURIComponent(input)
在服务器端,您必须根据W3C建议设置头类型并禁用缓存
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
然后像往常一样使用$_get获取数据。
$TotalNo = $_GET['duration'];
for ($i = 1; $i <= $TotalNo; $i++) {
updateProgress($i, $TotalNo);
sleep(1);
}
function updateProgress($currentVal, $totalNo) {
$completionPrecentage = $currentVal / $totalNo * 100;
echo "event: progressn";
echo 'data: {"progress": "' . $completionPrecentage . '"}';
echo "nn";
ob_flush();
flush();
}
如果你想发送数组,你可以参考这个
EventSource API不支持POST方法,但这并不意味着您不能将SSE与POST一起使用。您不能使用EventSource API。然而,也有其他的实现方式。一个例子是sse.js,它允许您指定有效负载,如果需要,还可以指定头。sse.js应该是EventSource的替代品,例如:
var source = new SSE("get_message.php");
source.onmessage=function(event)
{
document.getElementById("message-window").innerHTML+=event.data + "<br>";
};
为了使用POST方法,您只需要指定一个有效负载,例如:
var source = new SSE("get_message.php", {payload: 'Hello World'});
而且,由于它是一种完全兼容的polyfill,您可能可以这样做:
EventSource = SSE;
var source = new EventSource("get_message.php", {payload: 'Hello World'});
source.onmessage=function(event)
{
document.getElementById("message-window").innerHTML+=event.data + "<br>";
};