处理连续的JSONstream

(现已停用)页面http://stream.twitter.com/1/statuses/sample.json用于返回持续不断的JSON数据stream。

我想在我自己的网页中使用jQuery(或JavaScript,但最好是jQuery)来处理它,以便能够根据推文的实时提示来显示视觉效果。

因为据我所知,jQuery的parseJSON函数只会在所有的数据已经被服务器发送后才执行callback函数,但这实际上是一个连续的数据stream。 我怎样才能处理数据“发生”,但仍然保持连接运行?

更新2

这种事情最好现在用WebSockets完成。

它看起来像这样:

 var connection = new WebSocket('ws://html5rocks.websocket.org/echo', ['soap', 'xmpp']); 

立即将一些事件处理程序附加到连接,可以让您知道何时打开连接,何时收到传入消息或是否发生错误。

发送消息变得如此简单:

 connection.send('your message'); connection.send(binaryData); 

请参阅介绍WebSockets:将套接字引入Web以获取有关如何执行此操作的完整说明。

您可能还想咨询浏览器对WebSockets的支持 。

ASP.Net开发者:如果由于某种原因,你需要支持旧的浏览器,并且不想自己弄清楚如何处理那些不支持WebSocket的,那么可以考虑使用一个像SignalR这样的库。

更新1

大多数浏览器现在实现了EventSource API ,只要stream可以通过内容types的text/event-stream传递,就可以使得轮询非常容易。 旧的浏览器或那些由于某种原因不能devisestream的开发者可以使用一些辅助脚本来做同样的事情。

这是一个例子:

 var jsonStream = new EventSource('https://example.com/yourstreamingservice') jsonStream.onmessage = function (e) { var message = JSON.parse(e.data); // handle message }; 

这基本上是一个完整的版本,我在下面概述。

旧服务stream应答

你想要的是所谓的长轮询。 你将需要一个自定义的AJAX onreadystatechange处理函数。 而不是等待整个stream完成(因为它永远不会),你需要定期检查内容。 请注意,你需要做一些繁重的工作,在IE中使用iframe

大致:

  • 响应每个onreadystatechange事件并检查已放弃到当前字符的stream,以查看是否有足够的数据使用一个或多个离散事件。 您将需要使用JavaScriptstring处理函数自己分析stream。 split,indexOf,正则expression式,循环等等的组合可以用来完成这个任务。
  • 如果还没有足够的内容,请退出并等待下一个事件。
  • 我很确定,每次onreadystatechange处理程序触发时, responseText将是迄今为止已经收到的所有数据。 定义一个持久variables,它将保存尚未正确处理的第一个字符的位置。
  • 一旦有一个或多个离散事件出现在stream中的内容足够多时,将它们一个一个取出,然后将它们传递给JSONparsing器,以便将文本实际呈现为对象。 正常使用它们。

查看AJAX模式下的HTTP Streaming ,了解关于这个确切的主题的一个很好的讨论(它也包括了你正在做的Service Streaming)。 如上所述,如果您必须支持IE,那么您需要使用iframe方法。

总之,服务stream使得HTTPstream式传输方法更加灵活,因为您可以传输任意内容而不是JavaScript命令,并且可以控制连接的生命周期。 但是,它将两种浏览器之间不一致的技术与可预测的可移植性问题结合在一起。 实验表明,页面stream技术可以在IE和Firefox上运行,但是服务stream只能在Firefox上运行,无论是使用XMLHTTPRequest还是IFrame。 在第一种情况下,IE将压缩响应直至完成,如果使用解决方法,IFrame将起作用:IE在接收到前256个字节后接收来自服务器的消息,因此唯一要做的就是在发送之前发送256个虚拟字节消息。 在此之后,所有的信息将按预期到达。 所以在IE中也可以有一个完整的Service Streaming!

安全问题

普通的AJAX不能跨域,也就是说(现在我注意到你想从twitter中stream出的事实),你将无法做到你所要求的。 这可以用JSONP解决,但JSONP本质上不能被服务stream,而且不是由twitter提供的。 还有跨源资源共享 (CORS),但是Twitter不会为你设置这种function – 这是他们只能为与之关联的域所做的事情。 CORS需要一个现代的浏览器。

因此,您唯一的select就是在您的Web服务器上创build一个代理服务,以便为您执行对Twitter的请求,然后分发数据。 这只能从与主页面服务相同的域完成。 这样做也可以让你创build一个可以使用iframe技术的IE版本。 如果您不关心旧的IE版本,您可以自己实施CORS来打败域名限制,如果您知道将要发出请求的域名。

如果您完全控制了客户端软件(例如,如果是用于企业内部网),还有另一种select:将Web浏览器托pipe在编译的本地执行的应用程序的用户表单中。 我只使用C#做了这个,但我想可能从其他语言。 当您使用正确的浏览器对象时,由于它托pipe在C#应用程序中,因此C#应用程序可以打破跨域安全限制,读取和写入所有页面内容,而不pipe它来自哪个域。 我怀疑你的情况是这样,但是我想把这个选项放在这里给其他可能会感激的人。

我有一个开源项目,允许在现代浏览器上使用这个项目(在旧的浏览器上可以使用jQuery风格)。 调用语法与jQuery.ajax类似:

http://oboejs.com

您在问题中指定的url会发送一个JSON响应stream。 由于跨浏览器的域安全限制,您无法使用JavaScript访问它。 您需要在服务器上实现桥接服务器端脚本,您可以使用AJAX请求定期轮询 ,或在twitter.com上托pipe您的站点。 第一个似乎更可行。

处于非常基础级别的网页无法保持与服务器的实时/正在运行的连接。 Web浏览器向服务器发送请求。 服务器发送一个响应(HTML和更多)到客户端(网页浏览器)。 把这看作是一个无状态的模型 – 在请求和响应完成之后,任何连接都不会存活。

因此,你必须自己做。 您必须从客户端调用额外的定期请求。

一种方法是定期通过setInterval()函数调用您的AJAX / GETfunction。 例如:

 setInterval(function() { $.ajax({ url: "mydata/get", success: function(){ // update content. } }); }, 5000); 

这将每隔5秒发出一个AJAX请求到mydata / get(或任何你想使用的URL)。