Schneller Vorlauf bis Dezember 2017, Websockets werden von (praktisch) jedem Browser unterstützt und ihre Verwendung ist sehr verbreitet.
Dies bedeutet jedoch nicht, dass es Websockets gelungen ist, AJAX zu ersetzen, zumindest nicht vollständig, insbesondere da die HTTP / 2-Anpassung zunimmt.
Die kurze Antwort lautet, dass AJAX für die meisten REST-Anwendungen auch bei Verwendung von Websockets noch hervorragend geeignet ist. Aber Gott steckt im Detail, also ...:
AJAX zum Abrufen?
Die Verwendung von AJAX für Abfragen (oder lange Abfragen) stirbt aus (und sollte es auch sein), wird jedoch aus zwei guten Gründen weiterhin verwendet (hauptsächlich für kleinere Web-Apps):
Für viele Entwickler ist AJAX einfacher zu codieren, insbesondere wenn es um das Codieren und Entwerfen des Backends geht.
Mit HTTP / 2 wurden die höchsten Kosten im Zusammenhang mit AJAX (dem Aufbau einer neuen Verbindung) eliminiert, sodass AJAX-Anrufe sehr leistungsfähig sind, insbesondere beim Posten und Hochladen von Daten.
Allerdings ist Websocket Push weit überlegen AJAX (keine Notwendigkeit zur erneuten Authentifizierung oder resend Header, keine Notwendigkeit für „keine Daten“ Roundtrips, etc). Dies wurde mehrmals diskutiert .
AJAX für REST?
Eine bessere Verwendung für AJAX sind REST-API-Aufrufe. Diese Verwendung vereinfacht die Codebasis und verhindert, dass die Websocket-Verbindung blockiert wird (insbesondere bei mittelgroßen Daten-Uploads).
Es gibt eine Reihe zwingender Gründe, AJAX für REST-API-Aufrufe und Daten-Uploads zu bevorzugen :
Die AJAX-API wurde praktisch für REST-API-Aufrufe entwickelt und passt hervorragend.
REST-Aufrufe und Uploads mit AJAX lassen sich sowohl auf dem Client als auch im Backend erheblich einfacher codieren.
Mit zunehmender Datennutzlast werden Websocket-Verbindungen möglicherweise blockiert, sofern die Nachrichtenfragmentierungs- / Multiplexlogik nicht codiert ist.
Wenn ein Upload in einem einzelnen Websocket- send
Aufruf ausgeführt wird, kann ein Websocket-Stream blockiert werden, bis der Upload abgeschlossen ist. Dies verringert die Leistung, insbesondere bei langsameren Clients.
Ein gängiges Design verwendet kleine Bidi-Nachrichten, die über Websockets übertragen werden, während REST- und Daten-Uploads (Client zu Server) die Benutzerfreundlichkeit von AJAX nutzen, um zu verhindern, dass das Websocket blockiert.
Bei größeren Projekten wird jedoch die Flexibilität von Websockets und das Gleichgewicht zwischen Codekomplexität und Ressourcenmanagement das Gleichgewicht zugunsten von Websockets beeinflussen.
Zum Beispiel könnten Websocket-basierte Uploads die Möglichkeit bieten, große Uploads fortzusetzen, nachdem eine Verbindung getrennt und wiederhergestellt wurde (erinnern Sie sich an den 5-GB-Film, den Sie hochladen wollten?).
Durch das Codieren der Upload-Fragmentierungslogik ist es einfach, einen unterbrochenen Upload fortzusetzen (der schwierige Teil war das Codieren des Dings).
Was ist mit HTTP / 2-Push?
Ich sollte wahrscheinlich hinzufügen, dass die HTTP / 2-Push-Funktion Websockets nicht ersetzt (und wahrscheinlich auch nicht ersetzen kann).
Dies wurde hier bereits erläutert , es genügt jedoch zu erwähnen, dass eine einzelne HTTP / 2-Verbindung den gesamten Browser (alle Registerkarten / Fenster) bedient, sodass Daten, die von HTTP / 2 übertragen werden, nicht wissen, zu welcher Registerkarte / welchem Fenster sie gehören. Es entfällt die Fähigkeit, die Fähigkeit von Websocket zu ersetzen, Daten direkt auf eine bestimmte Registerkarte / ein bestimmtes Browserfenster zu übertragen.
Während Websockets für die kleine bidirektionale Datenkommunikation hervorragend geeignet sind, bietet AJAX dennoch eine Reihe von Vorteilen - insbesondere bei größeren Nutzdaten (Uploads usw.).
Und Sicherheit?
Je mehr Vertrauen und Kontrolle einem Programmierer geboten wird, desto leistungsfähiger ist das Tool ... und desto mehr Sicherheitsbedenken treten auf.
AJAX hätte von Natur aus die Oberhand, da seine Sicherheit in den Code des Browsers integriert ist (was manchmal fraglich ist, aber immer noch vorhanden ist).
Auf der anderen Seite sind AJAX-Aufrufe anfälliger für "Man in the Middle" -Angriffe, während Websockets-Sicherheitsprobleme normalerweise Fehler im Anwendungscode sind, die eine Sicherheitslücke verursacht haben (normalerweise finden Sie diese in der Backend-Authentifizierungslogik).
Persönlich finde ich das nicht so groß, wenn ich denke, dass Websockets etwas besser dran sind, besonders wenn Sie wissen, was Sie tun.
Meine bescheidene Meinung
IMHO würde ich Websockets für alles außer REST-API-Aufrufen verwenden. Big-Data-Uploads Ich würde fragmentieren und wenn möglich über Websockets senden.
Umfragen, IMHO, sollten verboten werden, die Kosten im Netzwerkverkehr sind schrecklich und Websocket Push ist selbst für neue Entwickler einfach zu verwalten.