Schermo con codice JavaScript che usa Fetch API per una chiamata HTTP

Fetch API e chiamate HTTP pulite in JavaScript

Le chiamate HTTP non devono essere un incubo pieno di callback e codice duplicato. Con la Fetch API vedrai come scrivere richieste pulite, leggibili e facili da testare.

Dimentica le complessità di `XMLHttpRequest`. È ora di padroneggiare la Fetch API JavaScript, l’interfaccia moderna e basata su Promise per effettuare richieste di rete in modo pulito, efficiente e nativo nel browser.

Il problema: chiamate HTTP complesse e legacy

Per anni, gli sviluppatori JavaScript si sono affidati a `XMLHttpRequest` (XHR) o a librerie esterne come jQuery (`$.ajax`) o Axios per comunicare con i server. Sebbene funzionali, questi metodi portano con sé una sintassi spesso verbosa e una gestione degli eventi complessa basata su callback, il che può portare al cosiddetto “callback hell”.

La soluzione è nativa, potente e già presente in tutti i browser moderni: la Fetch API. Questo strumento offre un approccio più logico e flessibile per gestire le richieste e le risposte HTTP, sfruttando la potenza delle Promises per un codice asincrono molto più leggibile e manutenibile.

La sintassi di base: effettuare una chiamata GET

La funzione `fetch()` è il cuore della API. Nel suo uso più semplice, accetta un solo argomento: l’URL della risorsa che si desidera recuperare. Per impostazione predefinita, esegue una richiesta GET.

Poiché `fetch()` restituisce una Promise, possiamo concatenare i metodi `.then()` per gestire la risposta e `.catch()` per intercettare eventuali errori di rete.


const apiUrl = 'https://api.example.com/data';

fetch(apiUrl)
  .then(response => response.json()) // Converte la risposta in JSON
  .then(data => {
    console.log('Dati ricevuti:', data);
    // Qui puoi manipolare i dati ricevuti
  })
  .catch(error => {
    console.error('Errore durante la chiamata fetch:', error);
  });
        

Capire l’oggetto Response

Il primo `.then()` non riceve direttamente i dati JSON. Riceve un oggetto `Response`, un flusso di dati che rappresenta l’intera risposta HTTP. Per estrarre il corpo della risposta nel formato desiderato, dobbiamo usare uno dei suoi metodi, come:

  • `response.json()`: per parsare il corpo della risposta come JSON.
  • `response.text()`: per ottenere la risposta come stringa di testo.
  • `response.blob()`: per gestire dati binari come immagini o file.

Anche questi metodi restituiscono una Promise, motivo per cui è necessaria una seconda chiamata a `.then()`.

Come gestire gli errori con la Fetch API JavaScript

Un aspetto cruciale da capire è che `fetch()` fallisce (rifiuta la sua Promise) solo in caso di errore di rete (es. mancata connessione, problemi DNS). Un codice di stato HTTP come 404 (Not Found) o 500 (Internal Server Error) non causa un `catch`!

Per gestire correttamente gli errori HTTP, dobbiamo controllare la proprietà `response.ok` (che è `true` per stati da 200 a 299) o `response.status` nel primo `.then()`.


fetch('https://api.example.com/non-esiste')
  .then(response => {
    if (!response.ok) {
      // Se la risposta non è OK, lanciamo un errore per essere catturati dal .catch()
      throw new Error(`Errore HTTP! Stato: ${response.status}`);
    }
    return response.json();
  })
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error('Si è verificato un problema:', error.message);
  });
        

Effettuare chiamate POST e inviare dati

Per richieste diverse da GET, come POST o PUT, `fetch()` accetta un secondo argomento opzionale: un oggetto di configurazione. Qui possiamo specificare il metodo, gli header e il corpo della richiesta.

Quando si inviano dati JSON, è fondamentale impostare correttamente l’header `Content-Type` e convertire l’oggetto JavaScript in una stringa JSON tramite `JSON.stringify()`.


const postData = {
  username: 'testuser',
  email: 'test@example.com'
};

fetch('https://api.example.com/users', {
  method: 'POST', // Specifica il metodo HTTP
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(postData) // Converte l'oggetto in una stringa JSON
})
.then(response => response.json())
.then(data => {
  console.log('Risposta dal POST:', data);
})
.catch(error => {
  console.error('Errore nel POST:', error);
});
        

Conclusione: adotta la Fetch API

La Fetch API JavaScript rappresenta lo standard moderno per le interazioni di rete nel web. Offre una sintassi pulita, una potente gestione asincrona tramite Promises e la flessibilità per gestire qualsiasi tipo di richiesta HTTP senza la necessità di dipendenze esterne. Padroneggiarla significa scrivere codice più efficiente, leggibile e a prova di futuro.

Inizia oggi a sostituire le vecchie chiamate `XMLHttpRequest` o a ridurre le dipendenze del tuo progetto. La tua codebase ti ringrazierà.