我可以使用 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 支持,并展示了如何向在前面章节中构建的应用程序添加变通方法。
我有一个很长的 运行 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 支持,并展示了如何向在前面章节中构建的应用程序添加变通方法。