Scarica API vs XMLHttpRequest


163

So che l'API Fetch utilizza se Promiseentrambi consentono di eseguire richieste AJAX a un server.

Ho letto che l'API Fetch ha alcune funzionalità extra, che non sono disponibili in XMLHttpRequest(e nel polyfill dell'API Fetch, poiché è basato su XHR).

Quali funzionalità extra ha l'API Fetch?


2
Anche se non riesco a ricordare sul posto, ci sono una o due cose che puoi fare con XHR che non puoi recuperare. Dici di aver letto che il recupero ha possibilità extra, quegli articoli non sono molto buoni se non dicono quello che sono
Jaromanda X

2
ho trovato le due cose che non puoi fare con il recupero che puoi con XHR ... non puoi impostare il tuo valore per il timeout della richiesta nel recupero, né puoi ottenere eventi di avanzamento
Jaromanda X

3
Il recupero è solo un modo semplificato di fare le cose per la maggior parte dei tipi di XMLHttpRequests. Se il tuo caso d'uso si adatta a ciò che fa Fetch, allora usalo. Quando si arriva fino ad esso, l'API XMLHttpRequest è brutta per ciò che la maggior parte delle persone usa. Il recupero è stato uno sforzo per offrire un modo più pulito di fare cose che non hanno bisogno di una libreria racchiusa in XMLHttpRequest per renderlo appetibile.
jfriend00,

1
Ha un supporto puro nei browser ( caniuse.com/#search=fetch ), quindi c'è un polifill per esso github.com/github/fetch , che funziona sopra xhr
ilyabasiuk il

4
@Marco - Come puoi non dire che fetch(url).then(function(data) (...));non è più semplice che usare XMLHttpRequestper fare la stessa cosa? Potrebbe avere molte altre funzionalità, ma accidenti, è sicuramente più semplice da usare per le cose comuni. È un'API ripulita.
jfriend00,

Risposte:


120

Ci sono alcune cose che puoi fare con fetch e non con XHR:

  • È possibile utilizzare l'API della cache con gli oggetti richiesta e risposta;
  • È possibile eseguire no-corsrichieste, ottenendo una risposta da un server che non implementa CORS. Non è possibile accedere al corpo della risposta direttamente da JavaScript, ma è possibile utilizzarlo con altre API (ad esempio l'API della cache);
  • Streaming di risposte (con XHR l'intera memoria è bufferizzata in memoria, con fetch sarai in grado di accedere al flusso di basso livello). Questo non è ancora disponibile in tutti i browser, ma lo sarà presto.

Ci sono un paio di cose che puoi fare con XHR che non puoi ancora fare con fetch, ma saranno disponibili prima o poi (leggi il paragrafo "Miglioramenti futuri" qui: https: //hacks.mozilla .org / 2015/03 / this-api-is-so-fetching / ):

  • Annulla una richiesta (ora funziona in Firefox e Edge, come spiega @sideshowbarker nel suo commento);
  • Segnala progressi.

Questo articolo https://jakearchibald.com/2015/thats-so-fetch/ contiene una descrizione più dettagliata.


1
Le specifiche per l'API Fetch ora prevedono la cancellazione. Finora il supporto è stato fornito in Firefox 57 e Edge 16. Demo: fetch-abort-demo-edge.glitch.me , mdn.github.io/dom-examples/abort-api . E ci sono bug di funzionalità di Chrome e Webkit aperti bugs.chromium.org/p/chromium/issues/detail?id=750599 , bugs.webkit.org/show_bug.cgi?id=174980 . Come fare: developers.google.com/web/updates/2017/09/abortable-fetch , developer.mozilla.org/en-US/docs/Web/API/AbortSignal#Examples . Ed esempio nella risposta Stack Overflow su stackoverflow.com/a/47250621/441757
sideshowbarker il

1
Un'altra differenza è che le fetchrichieste non possono essere riprodotte su Strumenti per sviluppatori.
Parziphal,

E, per mia esperienza, fetchposso richiedere file, ma XHR no.
D. Pardal,

64

andare a prendere

  • manca un metodo incorporato per consumare documenti
  • nessun modo per impostare un timeout ancora
  • impossibile sovrascrivere l'intestazione della risposta del tipo di contenuto
  • se l'intestazione della risposta della lunghezza del contenuto è presente ma non esposta , la lunghezza totale del corpo è sconosciuta durante lo streaming
  • chiamerà il gestore di interruzione del segnale anche se la richiesta è stata completata
  • nessun progresso di caricamento (supporto per ReadableStreamistanze in quanto gli organismi di richiesta devono ancora arrivare )

XHR

  • non c'è modo di non inviare cookie (a parte l'utilizzo del flag non standardmozAnon o del AnonXMLHttpRequestcostruttore)
  • impossibile restituire FormDataistanze
  • non ha un equivalente a fetch's no-corsmodalità
  • segui sempre i reindirizzamenti

13
fetchmanca anche il progresso. con XHR puoi monitorare i progressi con l' progressevento
rzr

1
"impossibile sovrascrivere l'intestazione del tipo di contenuto della risposta" ... questa è solo una cattiva idea per cominciare. il 'content-type impone ciò che deve essere restituito e il BACKEND DOVREBBE dettarlo al frontend. IN FATTO, il tipo di contenuto dovrebbe essere l '"SOLO HEADER" per il tipo perché ciò che viene richiesto è ciò che deve essere restituito. Se desideri qualcosa di diverso, servi da un sottodominio speciale o qualcosa del genere in modo da poter gestire funzionalità specifiche separate. Stai cercando di forzare una regola dell'1% in calo del 99% della gola di tutti.
Orubel,

@Knu sì e ora siamo più avanzati e possiamo facilmente automatizzare una soluzione al 90% e lasciare che i casi bizzarri si dirigano verso funzionalità diverse.
Orubel,

1
@rzr non esattamente, hai capito Response#body .
Knu,

9

Le risposte sopra sono buone e forniscono buone intuizioni, ma condivido la stessa opinione condivisa in questo post del blog degli sviluppatori di Google in quanto la differenza principale (dal punto di vista pratico) è la comodità della promessa integrata restituita dafetch

Invece di dover scrivere codice in questo modo

function reqListener() {
    var data = JSON.parse(this.responseText);
}

function reqError(err) { ... }

var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.onerror = reqError;
oReq.open('get', './api/some.json', true);
oReq.send();

possiamo ripulire le cose e scrivere qualcosa di più conciso e leggibile con promesse e sintassi moderna

fetch('./api/some.json')
    .then((response) => {
        response.json().then((data) => { 
            ... 
        });
    })
    .catch((err) => { ... });

8
@TheOpti È possibile eseguire il polyfill del supporto per il recupero di base in IE 11. È inoltre possibile eliminare IE11 come browser supportato in molti progetti poiché in molte basi di utenti l'utilizzo di IE 11 è ora inferiore all'1%.
Devon Holcombe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.