我所拥有的是一个长时间运行的cgi-bin程序(运行3-15分钟),我想使用AJAX对其进行调用。在运行时,我想从中接收“服务器发送事件”数据并将其显示在我的网页上。 Kinda就像一个进度监视器,但更像一个聊天窗口,随着脚本运行,该窗口会自动更新。
这是我调用脚本的方式:var Params = []; // a large array containing values... not shown.$.ajax({ type: "POST", url: 'cgi-bin/datagen.cgi', data: { "id:: 1, "params": Params }, dataType: "json", success: function( db ){ console.log( "done" ); }});
我喜欢使用$.ajax(...
将大量json数据发布到脚本中的便捷性,但是我看不到切换到“服务器发送事件”消息传递来接收(监听)返回数据的方法。
使用SSE而不是Ajax,我看不到(也找不到示例)将大量数据发布到脚本中。
我也不能使用Websockets-所以SSE确实是我唯一的选择。
-交流
最佳答案
不幸的是,SSE不支持POST数据。这是标准中令人讨厌的疏忽。特别是考虑到浏览器通常仅将EventSource
作为XMLHttpRequest
的变体来实现,而该版本确实允许POST。
一种(混乱的)选择是让您的cgi将其进度写入日志文件,然后编写用于轮询该日志文件的SSE服务器脚本。您将有两个对服务器开放的套接字,一个用于ajax调用,一个用于SSE。 Yu
更好的选择是使用长轮询(也称为彗星)方法。您需要直接使用XMLHttpRequest
对象,而不是jQuery的$.ajax()
,但这还不错。优点是(在大多数浏览器上)您可以免费获得想要做的事情,因为xhr对象正在调用onreadystatechange()
,其中包含您的后端脚本正在发送的所有进度信息。您可以通过查看xhr.readyState
来区分进度信息和最终结果:3表示正在进行中,4表示已完成。
查看带有SSE的HTML5数据推送应用程序的第7章(O'Reilly),以获得更多解释(免责声明:我的书),否则您将在网络上找到大量信息。关于身份验证的第9章是我抱怨SSE中缺少POST支持的地方,并展示了如何向较早章节中构建的应用程序添加解决方法。