</> HTML5Advent
ENFRESDEITPT

// apis · Web Platform Advent #1

La Fetch API in JavaScript: una guida pratica

Come effettuare richieste HTTP nel browser con la Fetch API — GET, JSON, POST, gestione degli errori e annullamento delle richieste — con esempi eseguibili.

Un editor di codice sullo schermo che mostra sorgente HTML, CSS e JavaScript

La Fetch API è il modo moderno, basato sulle promise, per effettuare richieste HTTP dal browser. Sostituisce il vecchio XMLHttpRequest con un'interfaccia più pulita che funziona naturalmente con async/await e con gli stream. Tutti i browser attuali la supportano.

Una prima richiesta GET

fetch() restituisce una promise che si risolve in un oggetto Response. Per leggerne il JSON, si chiama response.json(), che a sua volta restituisce una promise:

const res = await fetch('https://api.example.com/articles');
const data = await res.json();
console.log(data);

La stessa cosa senza async/await, con catene di .then():

fetch('https://api.example.com/articles')
  .then((res) => res.json())
  .then((data) => console.log(data));

L'insidia: fetch non viene rifiutata sugli errori HTTP

È ciò che sorprende quasi tutti. Una risposta 404 o 500 resta una fetch riuscita — la promise viene rifiutata solo in caso di guasto di rete (offline, DNS, CORS). Devi controllare response.ok da solo:

const res = await fetch(url);
if (!res.ok) {
  throw new Error(`HTTP ${res.status} ${res.statusText}`);
}
const data = await res.json();
Uno switch di rete con cavi, che rappresenta i dati che viaggiano tra client e server
Ogni chiamata fetch() invia una richiesta HTTP attraverso la rete a un server e attende che la risposta compia il viaggio di ritorno.

Inviare dati con POST

Passa un secondo argomento di opzioni per impostare il metodo, gli header e il corpo. Per il JSON, serializza il payload e imposta il Content-Type:

const res = await fetch('/api/articles', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ title: 'Ciao', body: 'Mondo' }),
});
const created = await res.json();

Annullare una richiesta

Usa un AbortController per annullare una richiesta — utile per i timeout o quando un componente viene smontato:

const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 5000);

try {
  const res = await fetch(url, { signal: controller.signal });
  const data = await res.json();
} catch (err) {
  if (err.name === 'AbortError') console.log('Richiesta scaduta');
} finally {
  clearTimeout(timeout);
}

Riferimento rapido

AttivitàCome
Leggere JSONawait res.json()
Leggere testoawait res.text()
Verificare il successores.ok / res.status
Inviare JSONbody: JSON.stringify(...) + Content-Type
AnnullareAbortController + signal

Questo copre i casi quotidiani. La Fetch API supporta anche lo streaming dei corpi delle risposte, gli upload con FormData e la clonazione di richiesta/risposta — ma i pattern qui sopra gestiscono la stragrande maggioranza delle chiamate reali.