我可以使用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调用它。当它运行时,我想从它接收服务器发送的事件数据,并将其显示在我的网页上。有点像进度监视器,但更像是一个聊天窗口,在脚本运行时会自动更新。
以下是我对脚本的调用方式:
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支持的地方,并展示了如何向前几章中构建的应用程序添加变通方法。
- Slack Botkit-如何获得消息's来自'reaction_aded'事件
- 如果确认消息,则触发单击事件
- 如何从视频标记错误事件中获取字符串/消息或代码
- 我可以使用jquery和AJAX来调用cgi-bin脚本,然后添加消息事件来处理服务器发送事件吗
- 用于查看消息的ThunderBird事件
- Thunderbird 撰写发送消息事件不会触发
- 有没有办法在事件发生时将消息从服务器发送到客户端
- 如果出现错误消息,如何防止事件
- 如何在网格视图中链接按钮的客户端单击事件上显示动态消息
- 使用 jQuery 返回除 Drupal7 表单之外的所有点击事件的消息
- Phonegap PushPlugin 消息事件被调用两次
- 加载从跨文档消息传递中作为事件数据获得的 pdf
- React,在组件事件上呈现消息的最佳方法
- 如何连续多次获取 Ajax 成功消息事件
- 如何处理来自 websocket 的消息事件数据
- 如何使用定时事件使用JavaScript显示然后隐藏消息
- 在onClick事件或XML中点击菜单按钮后的确认消息
- 按钮点击事件上的警报消息
- 删除“;“包裹”;用于发布/子消息传递的事件处理程序
- 一直只显示10个最近的服务器发送的事件消息