Introduzione
Quando una pagina JavaScript “non funziona”, il problema non è sempre nel codice in sé: spesso dipende da una richiesta API fallita, da un file non caricato correttamente, da una risposta JSON inattesa o da un errore di CORS. In questi casi, aprire solo la console non basta. Uno dei sotto-argomenti più pratici del debugging nel browser è il controllo delle richieste di rete con il pannello Network degli strumenti di sviluppo.
Questo approccio è utile perché ti permette di vedere cosa succede davvero tra il tuo codice e il server: quali richieste partono, quali risposte arrivano, quanto tempo impiegano, se ci sono errori HTTP e se i dati ricevuti sono quelli previsti. È una competenza fondamentale per chi sviluppa applicazioni web moderne, soprattutto quando si lavora con fetch, API REST, asset esterni e autenticazione.
In questo tutorial vedremo come usare il pannello Network per individuare problemi reali, con un esempio completo e commentato. L’obiettivo non è solo “vedere i log”, ma imparare a leggere il comportamento dell’applicazione dal punto di vista del browser.
Codice completo
// Esempio: caricamento di una lista di prodotti da una API.
// Il codice mostra anche come gestire errori di rete e risposte non valide.
const API_URL = "https://jsonplaceholder.typicode.com/posts?_limit=5";
const app = document.createElement("div");
app.innerHTML = `
<h2>Prodotti</h2>
<button id="loadBtn">Carica dati</button>
<div id="status">In attesa...</div>
<ul id="list"></ul>
`;
document.body.appendChild(app);
const loadBtn = document.getElementById("loadBtn");
const statusEl = document.getElementById("status");
const listEl = document.getElementById("list");
loadBtn.addEventListener("click", async () => {
statusEl.textContent = "Caricamento in corso...";
listEl.innerHTML = "";
try {
const response = await fetch(API_URL, {
method: "GET",
headers: {
"Accept": "application/json"
}
});
// Controllo esplicito dello stato HTTP
if (!response.ok) {
throw new Error(`Errore HTTP: ${response.status} ${response.statusText}`);
}
// Leggo il JSON
const data = await response.json();
// Verifica minima della struttura attesa
if (!Array.isArray(data)) {
throw new Error("Formato dati non valido: atteso un array");
}
data.forEach(item => {
const li = document.createElement("li");
li.textContent = `${item.id} - ${item.title}`;
listEl.appendChild(li);
});
statusEl.textContent = `Caricati ${data.length} elementi con successo.`;
} catch (error) {
console.error("Errore durante il caricamento:", error);
statusEl.textContent = "Si è verificato un errore durante il caricamento.";
}
});
// Simulazione di una richiesta sbagliata per testare il debugging
// Sostituisci l´URL con uno non valido per vedere come appare un errore di rete.
// const API_URL = "https://jsonplaceholder.typicode.com/invalid-endpoint"; Spiegazione
Il codice crea una piccola interfaccia con un pulsante Carica dati. Quando l’utente clicca, viene eseguita una richiesta fetch verso una API pubblica. Se la risposta è corretta, i dati vengono mostrati in una lista. Se qualcosa va storto, viene mostrato un messaggio di errore e l’errore viene anche stampato in console.
1. Perché il pannello Network è utile
Se il codice non mostra nulla, potresti pensare che il bug sia nel DOM o nella logica JavaScript. In realtà, il problema potrebbe essere altrove:
- la richiesta non parte affatto;
- l’URL è sbagliato;
- il server risponde con un errore 404, 500 o 401;
- la risposta non è JSON valido;
- la richiesta viene bloccata da CORS;
- la connessione è lenta o instabile.
Il pannello Network ti mostra tutto questo in modo trasparente. Ogni richiesta viene registrata con stato, durata, tipo di contenuto e dettagli della risposta.
2. Cosa osservare durante il debugging
Quando apri gli strumenti del browser e vai nella sezione Network, puoi analizzare alcuni aspetti chiave:
- Nome della richiesta: identifica il file o l’endpoint chiamato.
- Status code: 200 significa successo, 404 indica risorsa non trovata, 500 problema lato server, 403 accesso negato.
- Timing: utile per capire se il problema è lentezza di rete o di backend.
- Headers: mostrano intestazioni inviate e ricevute, molto utili per autenticazione e caching.
- Response / Preview: ti permette di vedere il contenuto restituito dal server.
3. Come leggere un errore reale
Supponiamo di cambiare l’URL con un endpoint inesistente. Dal punto di vista del codice, il fetch non genera sempre un errore immediato: se il server risponde con un 404, la promise si risolve comunque, ma response.ok sarà falso. Ecco perché il controllo esplicito è importante.
Nel pannello Network vedrai la richiesta in rosso o con stato 404. Aprendola, potrai verificare:
- l’URL esatto chiamato;
- il metodo HTTP usato;
- la risposta del server;
- eventuali redirect;
- il payload inviato, se presente.
Questo ti evita di perdere tempo a controllare la UI quando il problema è semplicemente un endpoint errato.
4. Perché controllare anche le intestazioni
Molti bug “misteriosi” dipendono dalle headers. Ad esempio, se un’API si aspetta Accept: application/json o un token di autenticazione, una configurazione sbagliata può causare errori difficili da interpretare solo dal codice. Dal pannello Network puoi verificare se il browser ha inviato davvero le intestazioni corrette.
Questo è particolarmente importante in applicazioni con login, refresh token, richieste protette o integrazioni con servizi esterni.
5. Il valore del controllo del timing
Il pannello Network aiuta anche a distinguere tra un errore di logica e un problema di prestazioni. Se la richiesta impiega troppo tempo, potresti avere un backend lento, una connessione debole o un asset pesante. Guardando il timing puoi capire se il collo di bottiglia è nella fase di waiting, DNS, SSL o download.
Per esempio, se una pagina sembra bloccata ma la richiesta è ancora in corso, il problema non è nel rendering: il codice sta aspettando una risposta che tarda ad arrivare.
Best practice
- Controlla sempre il pannello Network quando lavori con API: è il primo posto da aprire se i dati non arrivano.
- Verifica lo stato HTTP con response.ok o response.status, non affidarti solo al fatto che la promise sia stata risolta.
- Usa endpoint di test affidabili durante lo sviluppo, così puoi distinguere un bug del codice da un problema del server.
- Esamina le headers quando ci sono problemi di autenticazione, CORS o formati dati.
- Confronta la risposta attesa con quella reale: spesso il bug è un formato diverso da quello previsto.
- Filtra le richieste nel pannello Network per concentrarti solo su fetch, XHR, JS o CSS, a seconda del problema.
- Usa messaggi di errore chiari nel codice, così puoi collegare rapidamente console e Network.
Riepilogo
Il pannello Network degli strumenti del browser è uno degli strumenti più efficaci per il debugging di applicazioni JavaScript che comunicano con server e API. Ti permette di vedere richieste, risposte, errori HTTP, intestazioni e tempi di caricamento, offrendo una visione concreta di ciò che accade tra frontend e backend.
In sintesi:
- se un dato non appare, controlla prima la richiesta di rete;
- se c’è un errore, verifica status code e risposta;
- se tutto sembra corretto ma la UI non cambia, il problema potrebbe essere nel rendering o nella gestione dello stato;
- se la pagina è lenta, analizza il timing delle richieste.
Imparare a leggere il pannello Network ti rende molto più veloce nel trovare bug reali e ti aiuta a ragionare come il browser, non solo come sviluppatore.
Approfondisci con risorse ufficiali
- MDN Web Docs - Using the Network panel
- MDN Web Docs - Fetch API
- Chrome DevTools Documentation - Network panel
- Firefox Developer Tools - Network Monitor
- MDN Web Docs - HTTP response status codes
