当前位置: 首页 > 知识库问答 >
问题:

服务器可以通过POST传递带有EventSource参数的发送事件(SSE)吗?

闻人栋
2023-03-14

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

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

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

共有3个答案

唐钊
2023-03-14

或者,您可以从使用另一个php自定义的文件中读取数据

http://..../command_receiver.php?命令=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>
凌和颂
2023-03-14

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

宋耀
2023-03-14

不,SSE标准不允许POST。

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

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

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

附言。标准没有明确说明不能使用POST。但是,与XMLHttpRequest不同,没有参数来指定要使用的超文本传输协议方法,也没有方法来指定要发布的数据。

 类似资料:
  • 问题内容: 我正在使用Html5服务器发送事件。服务器端是Java Servlet。我有一个要传递给服务器的json数组数据。 如果数组大小较小,则服务器端可以获取查询字符串。但是,如果数组大小很大。(可能超过数千个字符),服务器无法获取查询字符串。是否可以使用POST方法将json数组传递到服务器,从而避免了查询字符串长度的限制? 问题答案: 不可以,SSE标准不允许POST。 (出于技术原因,

  • 问题内容: 双方的WebSockets和服务器发送的事件能够将数据推送到浏览器。在我看来,它们似乎是竞争技术。它们之间有什么区别?您何时会选择一个? 问题答案: Websocket和SSE(服务器发送事件)都能够将数据推送到浏览器,但是它们不是竞争技术。 Websockets连接既可以将数据发送到浏览器,也可以从浏览器接收数据。可以使用websockets的应用程序的一个很好的例子是聊天应用程序。

  • 您好,我正在React中开发一个web应用程序,它使用Nginx从Express服务器接收SSE数据。 JS服务器 索引:JS const events=新事件源('https://api.myDomain.com/events', ); axios。post(<代码>https://api.myDomain.com/addCart,{客户端:this.state.clientId,购物车:car

  • 我想知道是否可以为服务器发送的事件(SSE;内容类型:文本/事件流)启用gzip压缩。 根据这本书,似乎有可能:http://chimera.labs.oreilly.com/books/1230000000545/ch16.html 但是我找不到任何带有gzip压缩的SSE示例。我尝试发送带有响应标头字段Content-Encode设置为“gzip”的gzip消息,但没有成功。 为了在SSE周围

  • 我想为我的网站创建实时通知。 参考链接:http://sinhamohit.com/writing/spring-boot-reactive-sse 我该怎么做呢?参考,链接和例子将是伟大的。

  • 我使用nghttp2实现了一个REST服务器,它应该使用HTTP/2和服务器发送的事件(由浏览器中的EventSource使用)。然而,基于这些例子,我不清楚如何实现SSE。像在< code>asio-sv.cc中那样使用res.push()似乎不是正确的方法。 做这件事的正确方法是什么?我更喜欢使用nghttp2的C API,但是C API也可以。

  • 我正在尝试使用泽西岛的JavaScript SSE。我的资源中有以下代码。我在Java7和Tomcat 7上托管。我没有收到任何错误。但我也没有在页面上看到数据。 我调用发布数据。它确实显示信息。但客户什么都没有。在Firefox中,我确实看到事件多次触发。 这是我使用的参考。https://jersey.java.net/documentation/latest/sse.html 我的Index

  • 我有一个ASP。net core 3.1服务器项目,它有一个非常简单的API发送单向服务器发送事件(SSE),如下所示: 现在,我想通过C#UWP客户端接收这些事件。很遗憾,我只收到第一个事件: 如何在UWP中创建行为以始终监听该连接并接收我可以进一步处理的事件?