Do przodu w grudniu 2017 r. Websockets są obsługiwane przez (praktycznie) każdą przeglądarkę, a ich użycie jest bardzo powszechne.
Nie oznacza to jednak, że Websockets udało się zastąpić AJAX, przynajmniej nie do końca, zwłaszcza gdy rośnie liczba adaptacji HTTP / 2.
Krótka odpowiedź jest taka, że AJAX jest nadal świetny dla większości aplikacji REST, nawet przy użyciu Websockets. Ale Bóg tkwi w szczegółach, więc ...:
AJAX do odpytywania?
Korzystanie z AJAX do odpytywania (lub długiego odpytywania) wymiera (i powinno być), ale nadal jest używane z dwóch dobrych powodów (głównie w przypadku mniejszych aplikacji internetowych):
Dla wielu programistów AJAX jest łatwiejszy do kodowania, szczególnie jeśli chodzi o kodowanie i projektowanie backendu.
Dzięki HTTP / 2 wyeliminowano najwyższy koszt związany z AJAX (ustanowienie nowego połączenia), dzięki czemu połączenia AJAX są dość wydajne, szczególnie w przypadku wysyłania i przesyłania danych.
Jednak wypychanie Websocket jest znacznie lepsze niż AJAX (nie trzeba ponownie uwierzytelniać ani ponownie wysyłać nagłówków, nie ma potrzeby robienia objazdów „bez danych” itp.). Zostało to wielokrotnie omówione .
AJAX dla REST?
Lepszym zastosowaniem dla AJAX są wywołania interfejsu API REST. Takie użycie upraszcza bazę kodu i zapobiega blokowaniu połączenia Websocket (szczególnie przy przesyłaniu danych średniej wielkości).
Istnieje wiele istotnych powodów, aby preferować AJAX do wywołań interfejsu API REST i przesyłania danych:
Interfejs API AJAX został praktycznie zaprojektowany do wywołań interfejsu API REST i jest doskonale dopasowany.
Wywołania REST i przesyłanie za pomocą AJAX są znacznie łatwiejsze do kodowania, zarówno na kliencie, jak i backend.
W miarę wzrostu ładunku danych połączenia Websocket mogą zostać zablokowane, chyba że zakodowana zostanie logika fragmentacji / multipleksowania wiadomości.
Jeśli przesyłanie jest wykonywane w pojedynczym send
wywołaniu Websocket , może on blokować strumień Websocket, dopóki przesyłanie nie zostanie zakończone. Spowoduje to zmniejszenie wydajności, szczególnie w przypadku wolniejszych klientów.
Wspólny projekt wykorzystuje małe wiadomości bidi przesyłane przez Websockets, podczas gdy REST i przesyłanie danych (klient do serwera) wykorzystują łatwość użycia AJAX, aby zapobiec blokowaniu Websocket.
Jednak w większych projektach elastyczność oferowana przez Websockets i równowaga między złożonością kodu a zarządzaniem zasobami przechyli równowagę na korzyść Websockets.
Na przykład przesyłanie oparte na Websocket może oferować możliwość wznowienia dużych przesyłania po zerwaniu połączenia i ponownym nawiązaniu połączenia (pamiętasz film 5 GB, który chcesz przesłać?).
Kodując logikę fragmentacji wysyłania, łatwo jest wznowić przerwane przesyłanie (trudna część to kodowanie).
Co z push / HTTP?
Powinienem chyba dodać, że funkcja push HTTP / 2 nie zastępuje (i prawdopodobnie nie może) zastąpić Websockets.
Zostało to już wcześniej omówione , ale wystarczy wspomnieć, że pojedyncze połączenie HTTP / 2 obsługuje całą przeglądarkę (wszystkie karty / okna), więc dane wypychane przez HTTP / 2 nie wiedzą, do której karty / okna należy, eliminując jego zdolność do zastępowania zdolności Websocket do przekazywania danych bezpośrednio do określonej karty / okna przeglądarki.
Podczas gdy Websockets świetnie nadają się do małych dwukierunkowych transmisji danych, AJAX wciąż ma wiele zalet - zwłaszcza przy rozważaniu większych ładunków (przesyłanie itp.).
A bezpieczeństwo?
Cóż, ogólnie, im więcej zaufania i kontroli zapewnia programista, tym potężniejsze narzędzie ... i tym więcej obaw związanych z bezpieczeństwem.
AJAX z natury miałby przewagę, ponieważ jego bezpieczeństwo jest wbudowane w kod przeglądarki (co czasem jest wątpliwe, ale nadal istnieje).
Z drugiej strony, wywołania AJAX są bardziej podatne na ataki typu „man in the middle”, podczas gdy problemy z bezpieczeństwem Websockets są zwykle błędami w kodzie aplikacji, które wprowadziły lukę w zabezpieczeniach (zwykle tam znajduje się logika uwierzytelniania zaplecza).
Osobiście nie uważam, żeby była to wielka różnica, jeśli myślę, że Websockets są nieco lepsze, szczególnie gdy wiesz, co robisz.
Moja skromna opinia
IMHO, używałbym Websockets do wszystkiego oprócz wywołań interfejsu API REST. Przesyłanie dużych danych Chciałbym fragmentować i wysyłać przez Websockets, jeśli to możliwe.
Sondowanie, IMHO, powinno być zakazane, koszt ruchu sieciowego jest okropny, a wypychanie Websocket jest wystarczająco łatwe do zarządzania nawet dla nowych programistów.