Обрабатывать непрерывный поток JSON


(ныне несуществующая) Страница http://stream.twitter.com/1/statuses/sample.json используется для возврата непрерывного и бесконечного потока данных JSON.

Я хотел бы обработать его с помощью jQuery (или JavaScript, но предпочтительно jQuery) внутри моей собственной веб-страницы, чтобы иметь возможность отображать визуальные эффекты на основе живой ленты твитов.

Так как насколько я знаю jQuery parseJSON функция будет выполнять функцию обратного вызова только после того, как все данные были отправлены сервер, но это на самом деле непрерывный поток данных. Как я могу обрабатывать данные "как это происходит", но при этом поддерживать соединение?

4 58

4 ответа:

обновление 2

такие вещи лучше всего делать с помощью WebSockets Теперь, который согласно CanIUse.Com это доступен во всех основных браузерах кроме Opera Mini (см. Эту ссылку для получения более подробной информации о старых или всех браузерах и перейдите на вкладку ресурсы, чтобы увидеть еще больше ссылок). В качестве обзора, websockets поддерживаются в IE 10+, Firefox 11+ (38+ если в контексте WebWorker), Chrome 16+, Opera 12.1+, Safari 7+, Android 4.4+, Opera Mobile 12.1+.

это выглядит так:

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

немедленное подключение некоторых обработчиков событий к соединению позволяет узнать, когда соединение открыто, когда вы получили входящие сообщения или произошла ошибка.

отправка сообщений становится так же просто, как это:

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

посмотреть знакомство с веб-сокетов: приведение розетки для интернета для полного объяснения, как это сделать этот.

ASP.Net разработчики: если по какой-то причине вам нужно поддерживать старые браузеры и вы не хотите сами решать, как бороться с теми, кто не поддерживает WebSockets, рассмотрите возможность использования библиотеки, такой как SignalR.

старый ответ API EventSource для старых браузеров

большинство браузеров теперь использовать тег EventSource API, что делает длинный Опрос очень легким, пока поток может быть поставляется с content-type text/event-stream. Старые браузеры или те разработчики, которые по какой-либо причине не могут спроектировать поток, чтобы иметь этот тип контента, могут использовать некоторые вспомогательный скрипт сделать то же самое.

вот пример:

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

это в основном полноценная версия того, что я описываю ниже.

еще более старый сервис потокового ответа для действительно старых браузеров

то, что вы хотите называется длинный опрос. Вам понадобится пользовательский AJAX onreadystatechange функции обработки. Вместо того, чтобы ждать, пока весь поток не будет завершен (так как он никогда не будет), вам нужно будет периодически проверять содержимое. Обратите внимание, что вам нужно будет сделать некоторые тяжелые подъемные для этого, чтобы работать в IE 9 и ниже, используя iframe.

грубо:

  • ответить на каждый onreadystatechange событие и проверьте поток, который вы получили до текущего символа, чтобы узнать, достаточно ли данных для потребляйте одно или несколько дискретных событий. Вам нужно будет самостоятельно проанализировать поток с помощью функций обработки строк javascript. Для выполнения этой задачи можно использовать комбинацию split, indexOf, регулярных выражений, циклов и т. д.
  • если еще недостаточно контента, то выйдите и дождитесь следующего события.
  • я уверен, что каждый раз onreadystatechange обработчик пожаров responseText будут все данные, которые были получены до сих пор. Определение постоянной переменной это будет удерживать позицию первого символа, который еще не был должным образом обработан.
  • как только в потоке появится достаточно контента для одного или нескольких дискретных событий, вынимайте их по одному и передавайте в свой JSON-парсер, чтобы фактически отобразить текст как объекты. Используйте их нормально.

зацените http Streaming gist для одного ресурса, или потоковая передача как альтернатива опросу сервера at Программное обеспечение. Если вы должны поддерживать IE 9 и старше, то вам нужно использовать iframe способ для этого.

здесь цитата книги шаблоны проектирования Ajax: создание веб-сайтов 2.0 с помощью шаблонов программирования и юзабилити:

таким образом, потоковое обслуживание делает подход к потоковой передаче HTTP более гибким, потому что вы можете передавать произвольный контент, а не Команды Javascript, и потому что вы можете управлять жизненный цикл соединения. Однако он сочетает в себе две технологии, которые не согласованы между браузерами, с предсказуемыми проблемами переносимости. Эксперименты показывают, что метод потоковой передачи страниц работает как на IE [9 и старше], так и на Firefox, но потоковая передача услуг работает только на Firefox, независимо от того, используется ли XMLHTTPRequest или IFrame. В первом случае IE [9 и старше] подавляет ответ до его завершения, с IFrame он работает, если используется обходной путь: IE [9 и старше] принимает сообщение с сервера после первых 256 байт, поэтому единственное, что нужно сделать, это отправить манекен 256 байт перед отправкой сообщения. После этого все сообщения будут поступать, как и ожидалось. Таким образом, полная потоковая передача услуг возможна и в IE [9 и старше]!

имейте в виду, что это с 2006 года, поэтому он определенно устарел, но если вам нужно поддерживать старые браузеры, это все еще актуально.

Вопросы Безопасности

обычный AJAX не может идти кросс-домен, что означает (теперь, когда я обращаю внимание на то, что вы хотите транслировать из twitter), что вы не сможете сделать то, что просите. Это можно обойти с помощью JSONP, но JSONP по своей природе не может быть потоковым сервисом и, кроме того, не предлагается twitter в любом случае. Есть также Кросс-Происхождения Совместное Использование Ресурсов (CORS) но twitter не собирается настраивать это для вас-это то, что они будут делать только для доменов, связанных с ними. И CORS требует современного браузер.

ваш единственный вариант, таким образом, чтобы создать прокси-сервис на вашем веб-сервере, который выполняет запросы к twitter для вас, а затем раздает данные. Это можно сделать только из того же домена, из которого обслуживалась главная страница. Это также позволит вам создать версию, которая будет работать для IE, используя технику фрейма. Если вы не заботитесь о старых версиях IE, вы можете реализовать CORS самостоятельно, чтобы победить ограничение домена, если вы знаете домен, который будет делая запросы.

если у вас есть полный контроль над клиентским программным обеспечением (например, если это для корпоративной интрасети), есть еще один вариант: размещение веб-браузера внутри скомпилированной локальной формы пользователя приложения. Я сделал это только с помощью C#, но я думаю, что это возможно с других языков. При использовании правильного объекта браузера, поскольку он размещен внутри приложения C#, приложение C# может обойти ограничения междоменной безопасности, чтение и запись все содержимое страницы независимо от того, из какого домена она исходит. Я сомневаюсь, что ваша ситуация такова, но я хотел бы поставить этот вариант здесь для других, кто может это оценить.

У меня есть проект с открытым исходным кодом, который позволяет это в современных браузерах (и возвращается к стилю jQuery на старых). Синтаксис вызова аналогичен jQuery.Аякс:

http://oboejs.com

url, который вы указали в своем вопросе, отправляет поток ответов JSON. Из-за кросс-доменных ограничений безопасности в браузерах вы не можете получить доступ к нему с помощью javascript. Вам нужно будет реализовать сценарий на стороне сервера моста на вашем сервере, который вы могли бы опрос через регулярные промежутки времени с помощью AJAX запросов или разместить свой сайт на twitter.com. Первый кажется более осуществимым.

веб-страница на очень фундаментальном уровне не может поддерживать живое/запущенное соединение с сервером. Веб-браузер отправляет запрос на сервер. Сервер отправляет ответ (HTML и многое другое) обратно клиенту (веб-браузеру). Подумайте об этом как о модели без состояния - никакое соединение никогда не сохраняется после завершения запроса и ответа.

поэтому вы должны сделать это сами. Вы должны вызывать дополнительные периодические запросы со стороны клиента.

один способ состоял бы в том, чтобы периодически вызывать ваш AJAX / получить функциональность через setInterval ()