我可以使用jquery和AJAX来调用cgi-bin脚本,然后添加消息事件来处理服务器发送事件吗

Can I use jquery and AJAX to call a cgi-bin script, then add message event to handle Server Sent Event?

本文关键字:事件 消息 添加 处理 服务器 然后 脚本 jquery 可以使 AJAX 我可以      更新时间:2023-09-26

我有一个长时间运行的cgi-bin程序(运行3-15分钟),我想使用AJAX调用它。当它运行时,我想从它接收服务器发送的事件数据,并将其显示在我的网页上。有点像进度监视器,但更像是一个聊天窗口,在脚本运行时会自动更新。

以下是我对脚本的调用方式: 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数据POST到脚本的轻松性,但我看不到切换到服务器发送事件消息来接收(侦听)返回数据的方法。使用SSE而不是ajax,我看不到(也找不到一个例子)将大量数据发布到脚本中。

我(还)不能使用Websockets,所以SSE实际上是我唯一的选择。

-AC

遗憾的是,SSE不支持POST数据。这是标准中令人讨厌的疏忽;特别是考虑到浏览器通常只是将EventSource实现为已经允许POST的XMLHttpRequest的变体。

一个(混乱的)选项是让cgi将其进度写入日志文件,然后编写一个SSE服务器脚本来轮询该日志文件。您将有两个对服务器开放的套接字,一个用于ajax调用,另一个用于SSE。Yuk.

更好的选择是使用长轮询(也称为彗星)方法。您需要直接使用XMLHttpRequest对象,而不是jQuery的$.ajax(),但它并没有那么糟糕。优点是(在大多数浏览器上)您可以免费获得想要做的事情,因为您的xhr对象正在调用onreadystatechange(),其中包含后端脚本正在发送的所有进度信息。您可以通过查看xhr.readyState来判断进度信息和最终结果之间的区别:3表示正在进行,4表示已完成。

查看带有SSE(O'Reilly)的HTML5数据推送应用程序的第7章,了解更多解释(免责声明:我的书),否则你会在网上找到大量信息。关于身份验证的第9章是我抱怨SSE中缺乏POST支持的地方,并展示了如何向前几章中构建的应用程序添加变通方法。