我可以使用 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?

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

这是我调用脚本的方式: 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(... 到 POST 大量 json 数据到脚本的便利性,但我看不到切换到服务器发送事件消息传递来接收(听)的方法对于 return 数据。 使用 SSE 而不是 ajax,我没有看到(也找不到示例)POST 向脚本发送大量数据。

我(还)不能使用 Websockets - 所以 SSE 真的是我唯一的选择。

-AC

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

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

更好的选择是使用长轮询(也称为彗星)方法。您需要直接使用 XMLHttpRequest 对象,而不是 jQuery 的 $.ajax(),但还不错。优点是(在大多数浏览器上)你可以免费得到你想做的事情,因为你的 xhr 对象正在调用 onreadystatechange() 并使用你的后端脚本发送的所有进度信息。看xhr.readyState就可以区分进度信息和最终结果:3表示进行中,4表示完成。

查看 HTML5 Data Push Apps with SSE (O'Reilly) 的第 7 章以获得更多解释(免责声明:我的书),或者您会在网上找到大量信息。第 9 章,关于身份验证,我抱怨 SSE 缺乏 POST 支持,并展示了如何向在前面章节中构建的应用程序添加变通方法。