Przetwarzaj ciągły strumień JSON

(obecnie nieistniejąca) Strona http://stream.twitter.com/1/statuses/sample.json używany do zwracania ciągłego i niekończącego się strumienia danych JSON.

Chciałbym przetworzyć go za pomocą jQuery (lub JavaScript, ale najlepiej jQuery) wewnątrz mojej własnej strony internetowej, aby móc wyświetlać efekty wizualne w oparciu o transmisję na żywo tweetów.

Ponieważ z tego co wiem funkcja jQuery parseJSON wykona funkcję callback dopiero po wysłaniu wszystkich danych przez serwer, ale jest to w rzeczywistości ciągły strumień danych. Jak mogę przetwarzać dane "tak jak to się dzieje", ale nadal utrzymywać połączenie?

Author: pnuts, 2011-07-02

4 answers

Update 2

Tego typu rzeczy najlepiej zrobić za pomocą WebSockets teraz, co według CanIUse.Com jest dostępna we wszystkich głównych przeglądarkach z wyjątkiem Opery Mini (zobacz ten link, aby uzyskać więcej informacji o starszych lub wszystkich przeglądarkach, i kliknij kartę Zasoby, aby zobaczyć jeszcze więcej linków). Przegląd websockets jest obsługiwany w IE 10+, Firefox 11 + (38 + jeśli w kontekście WebWorker), Chrome 16+, Opera 12.1+, Safari 7+, Android 4.4+, Opera Mobile 12.1+.

Wygląda to tak:

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

Dołączenie niektórych procedur obsługi zdarzeń natychmiast do połączenia pozwala wiedzieć, kiedy połączenie jest otwarte, kiedy otrzymujesz wiadomości przychodzące lub czy wystąpił błąd.

Wysyłanie wiadomości staje się tak proste jak to:

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

Zobacz Introducting WebSockets: Bringing Sockets to the Web aby uzyskać pełne wyjaśnienie, jak to zrobić.

ASP.Net deweloperzy: jeśli z jakiegoś powodu jeśli potrzebujesz wsparcia dla starszych przeglądarek i nie chcesz samodzielnie rozgryźć, jak radzić sobie z tymi, które nie obsługują Websocketów, rozważ użycie biblioteki, takiej jak SignalR.

Odpowiedź API Old EventSource dla starszych przeglądarek

Większość przeglądarek teraz implementuje EventSource API , co sprawia, że długie ankiety są naprawdę łatwe, o ile strumień może być dostarczany z content-type text/event-stream. Starszych przeglądarek lub tych programistów, którzy z jakiegokolwiek powodu nie mogą inżynier strumienia, aby mieć ten typ zawartości, może użyć skryptu pomocniczego , aby zrobić to samo.

Oto przykład:

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

Jest to w zasadzie pełnoprawna wersja tego, co opisuję poniżej.

Jeszcze starsza usługa Streaming odpowiedzi dla naprawdę starych przeglądarek

To, czego chcesz, to długie sondaże. Potrzebujesz niestandardowej funkcji obsługi AJAX onreadystatechange. Zamiast czekać aż cały strumień się skończy (ponieważ nigdy nie będzie), będziesz musiał okresowo sprawdzać zawartość. Zauważ, że będziesz musiał wykonać ciężkie podnoszenie, aby to działało w IE 9 i niższych, używając iframe.

Mniej więcej:

  • odpowiadaj na każde zdarzenie onreadystatechange i sprawdzaj strumień przekazywany bieżącej postaci, aby sprawdzić, czy jest wystarczająco dużo danych, aby pochłonąć jedno lub więcej dyskretnych zdarzeń. Musisz samodzielnie przeanalizować strumień za pomocą funkcji obsługi łańcuchów javascript. Kombinacja split, indexOf, regular wyrażenia, zapętlenie itp. mogą być użyte do wykonania tego zadania.
  • jeśli nie ma jeszcze wystarczającej ilości treści, wyjdź i poczekaj na następne zdarzenie.
  • jestem prawie pewien, że za każdym razem, gdy zostanie wywołana funkcja obsługi onreadystatechange, responseText będą wszystkimi danymi, które zostały odebrane do tej pory. Zdefiniuj zmienną trwałą, która utrzyma pozycję pierwszego znaku, który nie został jeszcze poprawnie przetworzony.
  • gdy jest wystarczająco dużo treści, aby jedno lub więcej dyskretnych zdarzeń pojawiło się w streamuj, wyjmij je pojedynczo i przekaż do parsera JSON, aby faktycznie renderował tekst jako obiekty. Używaj ich normalnie.

Sprawdź to HTTP Streaming gist dla jednego Zasobu, lub Streaming jako alternatywa dla ankietowania serwera W SoftwareAs. Jeśli musisz obsługiwać IE 9 lub starszy, musisz użyć do tego metody iframe.

Oto cytat z książki Ajax wzorce projektowe: tworzenie stron Web 2.0 z Wzorce programowania i użyteczności :

Podsumowując, strumieniowanie usług sprawia, że podejście strumieniowania HTTP jest bardziej elastyczne, ponieważ możesz przesyłać dowolne treści zamiast poleceń Javascript i ponieważ możesz kontrolować cykl życia połączenia. Łączy jednak dwie technologie, które nie są spójne we wszystkich przeglądarkach, z przewidywalnymi problemami z przenośnością. Eksperymenty sugerują, że technika strumieniowania stron działa zarówno na IE [9 i starszych], jak i na Firefoksie, ale Usługa Streaming działa tylko na Firefoksie, czy XMLHttpRequest lub IFrame jest używany. W pierwszym przypadku IE [9 i starsze] wstrzymuje odpowiedź aż do jej zakończenia, Z Ramką IFrame działa, jeśli zastosowano obejście: IE [9 i starsze] akceptuje wiadomość z serwera po pierwszych 256 bajtach, więc jedyną rzeczą do zrobienia jest wysłanie 256 bajtów atrapy przed wysłaniem wiadomości. Po tym wszystkie wiadomości dotrą zgodnie z oczekiwaniami. Więc pełna usługa Streaming jest możliwa w IE [9 i starszych], też!

Pamiętaj, że pochodzi z 2006 roku, więc jest zdecydowanie nieaktualny, ale jeśli musisz obsługiwać starsze przeglądarki, nadal jest odpowiedni.

Kwestie Bezpieczeństwa

Normalny AJAX nie może przejść między domenami, co oznacza (teraz, gdy zwracam uwagę na fakt, że chcesz streamować z Twittera), że nie będziesz w stanie zrobić tego, o co prosisz. Można to obejść za pomocą JSONP, ale JSONP z natury nie może być przesyłany strumieniowo, a ponadto nie jest oferowany przez twitter w każdym razie. Istnieje również Cross-Origin Resource Sharing (CORS), ale twitter nie skonfiguruje tego dla ciebie-to rodzaj rzeczy, które robią tylko dla domen powiązanych z nimi. A CORS wymaga nowoczesnej przeglądarki.

Jedyną opcją jest utworzenie usługi proxy na serwerze WWW, która wykonuje dla Ciebie żądania do Twittera, a następnie przekazuje dane. Można to zrobić tylko z tej samej domeny, z której serwowana była strona główna. To również pozwoli Ci Utwórz wersję, która będzie działać dla IE przy użyciu techniki iframe. Jeśli nie dbasz o stare wersje IE, możesz zaimplementować CORS samodzielnie, aby pokonać ograniczenie domeny, jeśli znasz domenę, która będzie składać wnioski.

Jeśli masz pełną kontrolę nad oprogramowaniem klienckim (tak jak w przypadku firmowego intranetu), istnieje inna opcja: hosting przeglądarki internetowej wewnątrz skompilowanego lokalnie formularza użytkownika aplikacji. Zrobiłem to tylko przy użyciu C# , ale wyobrażam sobie, że to możliwe z innych języków. Gdy używasz odpowiedniego obiektu przeglądarki, ponieważ jest on hostowany wewnątrz aplikacji C#, Aplikacja C# może pokonać ograniczenia bezpieczeństwa między domenami, odczytywając i zapisując całą zawartość strony bez względu na to, z jakiej domeny pochodzi. Wątpię, że Twoja sytuacja jest taka, ale chciałem umieścić opcję tutaj dla innych, którzy mogą to docenić.

 73
Author: ErikE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 16:35:50

Mam projekt open source, który pozwala na to w nowoczesnych przeglądarkach (i wraca do stylu jQuery na starszych). Składnia wywołania jest podobna do jQuery.ajax:

Http://oboejs.com

 8
Author: jimhigson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-10 15:10:13

Adres URL podany w pytaniu wysyła strumień odpowiedzi JSON. Ze względu na ograniczenia bezpieczeństwa między domenami w przeglądarkach nie można uzyskać do niego dostępu za pomocą javascript. Będziesz musiał zaimplementować skrypt bridge server side na swoim serwerze, który Możesz przepytywać w regularnych odstępach czasu za pomocą żądań AJAX lub hostować swoją witrynę na twitter.com. Pierwszy wydaje się bardziej wykonalny.

 3
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-02 16:22:40

Strona internetowa na bardzo podstawowym poziomie nie może utrzymać połączenia live/running z serwerem. Przeglądarka internetowa wysyła żądanie do serwera. Serwer wysyła odpowiedź (HTML i inne) z powrotem do klienta (przeglądarki internetowej). Pomyśl o tym jako o modelu bezpaństwowym - żadne połączenie nigdy nie jest utrzymywane przy życiu po zakończeniu żądania i odpowiedzi.

Dlatego musisz to zrobić sam. Musisz wywoływać dodatkowe, okresowe żądania od strony klienta.

Jednym ze sposobów byłoby okresowo wywołaj swoją funkcjonalność AJAX / GET za pomocą funkcji setInterval () . Na przykład:

setInterval(function() {

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

}, 5000);

Spowoduje to odpalenie żądania AJAX do mydata / get (lub dowolnego adresu URL, którego chcesz użyć) co 5 sekund.

 -13
Author: Kon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-02 16:25:59