Avanti veloce fino a dicembre 2017, i Websocket sono supportati da (praticamente) tutti i browser e il loro utilizzo è molto comune.
Tuttavia, ciò non significa che Websocket sia riuscito a sostituire AJAX, almeno non completamente, soprattutto perché l'adattamento HTTP / 2 è in aumento.
La risposta breve è che AJAX è ancora eccezionale per la maggior parte delle applicazioni REST, anche quando si utilizzano Websocket. Ma dio è nei dettagli, quindi ...:
AJAX per il polling?
L'uso di AJAX per il polling (o polling lungo) sta scomparendo (e dovrebbe esserlo), ma rimane ancora in uso per due buoni motivi (principalmente per le app Web più piccole):
Per molti sviluppatori, AJAX è più facile da programmare, specialmente quando si tratta di codificare e progettare il backend.
Con HTTP / 2, il costo più elevato relativo ad AJAX (creazione di una nuova connessione) è stato eliminato, consentendo alle chiamate AJAX di essere abbastanza performanti, in particolare per la pubblicazione e il caricamento di dati.
Tuttavia, il push di Websocket è di gran lunga superiore ad AJAX (non è necessario riautenticare o inviare nuovamente le intestazioni, non è necessario il round trip "nessun dato", ecc.). Questo è stato discusso diverse volte.
AJAX per REST?
Un migliore utilizzo di AJAX sono le chiamate API REST. Questo utilizzo semplifica la base di codice e impedisce il blocco della connessione Websocket (soprattutto su upload di dati di medie dimensioni).
Esistono diversi motivi convincenti per preferire AJAX per le chiamate API REST e i caricamenti di dati:
L'API AJAX è stata praticamente progettata per le chiamate all'API REST ed è perfetta.
Le chiamate REST e i caricamenti con AJAX sono notevolmente più facili da codificare, sia sul client che sul back-end.
All'aumentare del payload dei dati, le connessioni Websocket potrebbero essere bloccate a meno che non sia codificata la logica di frammentazione / multiplex dei messaggi.
Se un caricamento viene eseguito in una singola send
chiamata Websocket , potrebbe bloccare un flusso Websocket fino al termine del caricamento. Ciò ridurrà le prestazioni, soprattutto su client più lenti.
Un design comune utilizza piccoli messaggi bidi trasferiti su Websocket mentre REST e upload di dati (da client a server) sfruttano la facilità d'uso di AJAX per impedire il blocco di Websocket.
Tuttavia, su progetti più grandi, la flessibilità offerta da Websocket e l'equilibrio tra la complessità del codice e la gestione delle risorse farà da bilancia a favore di Websocket.
Ad esempio, i caricamenti basati su Websocket potrebbero offrire la possibilità di riprendere i caricamenti di grandi dimensioni dopo che una connessione viene interrotta e ristabilita (ricordi quel film da 5 GB che volevi caricare?).
Codificando la logica di frammentazione del caricamento, è facile riprendere un caricamento interrotto (la parte difficile stava codificando la cosa).
Che dire di HTTP / 2 push?
Dovrei probabilmente aggiungere che la funzione push HTTP / 2 non (e probabilmente non può) sostituire Websocket.
Questo era stato discusso qui precedenza, ma basti ricordare che una singola connessione HTTP / 2 serve l'intero browser (tutte le schede / finestre), quindi i dati inviati da HTTP / 2 non sanno a quale scheda / finestra appartiene, eliminando la sua capacità di sostituire la capacità di Websocket di inviare i dati direttamente a una specifica scheda / finestra del browser.
Mentre i websocket sono ottimi per la comunicazione di dati bidirezionali di piccole dimensioni, AJAX ha comunque apportato numerosi vantaggi, soprattutto se si considerano payload più grandi (upload, ecc.).
E sicurezza?
Bene, generalmente, maggiore è la fiducia e il controllo offerti a un programmatore, più potente è lo strumento ... e maggiori sono i problemi di sicurezza che si insinuano.
AJAX per natura avrebbe il sopravvento, poiché la sua sicurezza è integrata nel codice del browser (che a volte è discutibile, ma è ancora lì).
D'altra parte, le chiamate AJAX sono più suscettibili agli attacchi "man in the middle", mentre i problemi di sicurezza di Websocket sono di solito bug nel codice dell'applicazione che ha introdotto un difetto di sicurezza (di solito la logica di autenticazione back-end è dove li troverai).
Personalmente non trovo che questa sia una grande differenza, se non altro credo che i Websocket siano leggermente migliori, specialmente quando sai cosa stai facendo.
La mia modesta opinione
IMHO, userei Websocket per tutto tranne le chiamate API REST. Caricamenti di big data Vorrei frammentare e inviare su Websocket quando possibile.
Il polling, IMHO, dovrebbe essere messo fuorilegge, il costo nel traffico di rete è orribile e la spinta di Websocket è abbastanza facile da gestire anche per i nuovi sviluppatori.