Messaggi di Stato HTTP
Riferimento ai codici di stato HTTP (1xx–5xx) con i più comuni spiegati e un esempio fetch() che si dirama su response.status.
Ogni volta che un browser carica una pagina, invia un modulo o il tuo JavaScript esegue una chiamata fetch(), il server risponde con un codice di stato HTTP a tre cifre. Questo codice indica al client se la richiesta è riuscita, è stata reindirizzata, è fallita a causa di qualcosa fatto dal client, o è fallita lato server. Il browser lo utilizza automaticamente — segue i reindirizzamenti, mostra la propria pagina di errore per alcuni codici e riutilizza il contenuto memorizzato nella cache per altri — ma come sviluppatore leggi questi codici anche direttamente: un modulo viene inviato e ti ramifichi in base alla risposta, oppure una fetch() si risolve e controlli response.ok (che è semplicemente "stato nell'intervallo 200–299").
Qui puoi trovare l'elenco dei codici di stato delle risposte del Protocollo di Trasferimento Ipertestuale (HTTP). Questi codici rispondono alla richiesta che un client fa a un server — che la richiesta utilizzi GET, POST o un altro metodo HTTP — e sono raggruppati in 5 classi in base alla prima cifra. Conoscerli ti aiuta a diagnosticare link interrotti, URL errati, invii di moduli falliti e risposte API inattese. Esaminiamo ogni classe:
Se ricevi una risposta non inclusa in questo elenco, significa che si tratta di una risposta non standard, forse personalizzata dal software del server.
Gestione dei codici di stato in JavaScript
Quando invii un modulo o chiami un API con fetch(), la richiesta ha successo (la promise si risolve) anche quando il server restituisce un errore 4xx o 5xx — un 404 o 500 è comunque una risposta HTTP valida, non un errore di rete. Devi quindi ispezionare tu stesso lo stato. La scorciatoia pratica è response.ok, che è true solo per l'intervallo 200–299; per qualsiasi altro caso ti ramifichi su response.status per reagire in modo appropriato:
const form = document.querySelector("#signup");
form.addEventListener("submit", async (event) => {
event.preventDefault();
const response = await fetch("/api/signup", {
method: "POST",
body: new FormData(form),
});
if (response.ok) {
// 200–299: success
window.location.href = "/welcome";
} else if (response.status === 401) {
showMessage("Please log in first.");
} else if (response.status === 422) {
// Validation errors returned as JSON
const data = await response.json();
showMessage(data.error);
} else if (response.status === 429) {
// Rate limited — respect the Retry-After header
const wait = response.headers.get("Retry-After");
showMessage(`Too many attempts. Try again in ${wait}s.`);
} else if (response.status >= 500) {
showMessage("Server error — please try again later.");
} else {
showMessage(`Unexpected error (${response.status}).`);
}
});Nota che fetch() rigetta solo in caso di problemi di rete genuini (nessuna connessione, blocco CORS, errore DNS), quindi racchiudere la chiamata in un try…catch gestisce quelli, mentre il blocco if/else sopra gestisce lo stato HTTP stesso.
I codici più comuni da conoscere per primi. Se ne memorizzi solo una manciata, scegli questi: 200 (OK), 301 (Spostato Permanentemente), 302 (Trovato / reindirizzamento temporaneo), 401 (Non Autorizzato), 403 (Vietato), 404 (Non Trovato) e 500 (Errore Interno del Server). Coprono la grande maggioranza di ciò che vedrai negli strumenti di sviluppo del browser e nei log del server.
1xx: Informazione
| Codice di stato | Messaggio | Descrizione |
|---|---|---|
| 100 | Continue | Indica che il server ha ricevuto le intestazioni della richiesta e il client dovrebbe continuare a inviare il corpo della richiesta. |
| 101 | Switching Protocols | Indica che il client, che ha effettuato una richiesta, ha chiesto al server di cambiare protocollo (ad esempio, per aggiornare a una connessione WebSocket). |
| 102 | Processing | Un codice WebDAV che indica che il server ha accettato la richiesta ma non l'ha ancora completata; utilizzato per evitare che il client vada in timeout durante un'operazione lunga. |
| 103 | Early Hints | Definito in RFC 8297. Consente al server di inviare alcune intestazioni di risposta (come intestazioni Link che precaricano risorse) prima della risposta finale, in modo che il browser possa iniziare prima a recuperare le risorse. |
2xx: Successo
| Codice di stato | Messaggio | Descrizione |
|---|---|---|
| 200 | OK | Indica che la richiesta è andata a buon fine. È la risposta standard per le richieste HTTP riuscite. |
| 201 | Created | Indica che la richiesta è stata soddisfatta e una nuova risorsa è stata creata. |
| 202 | Accepted | Indica che la richiesta è stata accettata per l'elaborazione, ma l'elaborazione è in corso. |
| 203 | Non-Authoritative Information | Indica che la richiesta è stata elaborata con successo, ma restituisce informazioni che potrebbero provenire da un'altra fonte. |
| 204 | No Content | Indica che la richiesta è stata elaborata con successo, ma non restituisce alcun contenuto. |
| 205 | Reset Content | Indica che la richiesta è stata elaborata, ma non restituisce alcun contenuto e richiede che chi ha fatto la richiesta ripristini la visualizzazione del documento. |
| 206 | Partial Content | Indica che il server fornisce solo una parte della risorsa, a causa di un'intestazione range inviata dal client. |
3xx: Reindirizzamento
| Codice di stato | Messaggio | Descrizione |
|---|---|---|
| 300 | Multiple Choices | Indica più opzioni per la risorsa che il client può seguire. |
| 301 | Moved Permanently | Indica che la pagina è stata spostata definitivamente a un nuovo URL. I browser e i motori di ricerca aggiornano i loro riferimenti, quindi un 301 trasferisce il valore del link al nuovo URL ed è la scelta corretta per i reindirizzamenti ottimizzati per SEO. |
| 302 | Found | Indica che la pagina richiesta è stata temporaneamente spostata a un nuovo URL. I motori di ricerca mantengono indicizzato l'URL originale, quindi usa 302 (non 301) quando lo spostamento è temporaneo, ad esempio durante la manutenzione o i test A/B. |
| 303 | See Other | Indica che la risposta alla richiesta può essere trovata a un altro URL, che il client dovrebbe recuperare con GET. Comunemente usato dopo un POST di un modulo per reindirizzare a una pagina di risultati. |
| 304 | Not Modified | Indica che la risorsa richiesta non è stata modificata dall'ultima volta che è stata memorizzata nella cache. Il server non invia alcun corpo, quindi il browser riutilizza la sua copia memorizzata nella cache — questo risparmia larghezza di banda e velocizza le visite ripetute. |
| 307 | Temporary Redirect | Indica che la pagina richiesta è stata temporaneamente spostata a un nuovo URL. A differenza del 302, il client deve mantenere il metodo di richiesta originale (un POST rimane un POST). |
| 308 | Permanent Redirect | Indica che la risorsa richiesta è stata spostata definitivamente a un nuovo URL. |
I codici non elencati qui (come 305 e 306) sono deprecati, rari o specifici di alcune estensioni.
4xx: Errore del Client
| Codice di stato | Messaggio | Descrizione |
|---|---|---|
| 400 | Bad Request | Indica che la richiesta non può essere soddisfatta a causa di una sintassi errata o di dati non validi. |
| 401 | Unauthorized | Indica che il client non è autenticato — le credenziali valide sono assenti o errate. Il server non sa ancora chi sei, quindi ti chiede di accedere. (Nota: il nome dice "Non Autorizzato" ma significa davvero "Non Autenticato".) |
| 402 | Payment Required | È riservato per uso futuro. |
| 403 | Forbidden | Indica che il client è autenticato ma non autorizzato — il server sa chi sei, ma non hai il permesso per questa risorsa. A differenza del 401, inviare di nuovo le credenziali non sarà di aiuto. |
| 404 | Not Found | Indica che la pagina richiesta non è al momento disponibile, ma potrebbe tornare disponibile in futuro. |
| 405 | Method Not Allowed | Indica che la richiesta è stata effettuata a una pagina che utilizza un metodo di richiesta non supportato per quella pagina. |
| 406 | Not Acceptable | Indica che il server può generare solo una risposta che il client non accetta. |
| 407 | Proxy Authentication Required | Indica che il client deve prima autenticarsi presso il proxy. |
| 408 | Request Timeout | Indica che il server ha esaurito il tempo di attesa per la richiesta. |
| 409 | Conflict | Indica che la richiesta non può essere completata a causa di un conflitto nella richiesta. |
| 410 | Gone | Indica che la pagina richiesta non è più disponibile. |
| 411 | Length Required | Indica che la lunghezza del contenuto non è definita e il server non accetterà la richiesta senza di essa. |
| 412 | Precondition Failed | Indica che una precondizione fornita nella richiesta è valutata come falsa dal server. |
| 413 | Request Entity Too Large | Indica che l'entità della richiesta è troppo grande e per questo il server non accetterà la richiesta. |
| 414 | Request-URI Too Long | Indica che l'URL è troppo lungo e per questo il server non accetterà la richiesta. Accade quando si converte una richiesta POST in una richiesta GET con molte informazioni nella query. |
| 415 | Unsupported Media Type | Indica che il tipo di media non è supportato e per questo il server non accetterà la richiesta. |
| 416 | Requested Range Not Satisfiable | Indica che il client ha richiesto una parte del file ma il server non è in grado di fornire quella parte. |
| 417 | Expectation Failed | Indica che il server non può soddisfare i requisiti del campo intestazione della richiesta Expect. |
| 418 | I'm a Teapot | Un codice scherzoso dall'RFC 2324 (il Hyper Text Coffee Pot Control Protocol). Non è un vero errore, ma alcune API lo restituiscono deliberatamente, quindi potresti incontrarlo in situazioni reali. |
| 422 | Unprocessable Content | Indica che la richiesta era ben formata ma contiene errori semantici che ne impediscono l'elaborazione — comunemente restituito dalle API quando i dati di un modulo o JSON non superano la validazione. |
| 429 | Too Many Requests | Indica che il client ha inviato troppe richieste in un dato periodo di tempo ("rate limiting"). La risposta include spesso un'intestazione Retry-After che indica quanto tempo attendere prima di riprovare. |
| 451 | Unavailable For Legal Reasons | Indica che la risorsa richiesta non è disponibile per motivi legali, come la censura o un ordine di rimozione (il numero fa riferimento al romanzo Fahrenheit 451). |
I codici non elencati qui (come 419, 420 e diversi nell'intervallo 423–431) sono rari, specifici di framework o non standard. Alcuni — come il 421 (Misdirected Request, utilizzato in HTTP/2) e il 451 sopra — sono standardizzati ma non comuni nel lavoro quotidiano.
5xx: Errore del Server
| Codice di stato | Messaggio | Descrizione |
|---|---|---|
| 500 | Internal Server Error | È un errore generico e gli utenti ricevono questo messaggio di errore quando non esiste un messaggio specifico più adeguato. |
| 501 | Not Implemented | Indica che il server non riconosce il metodo di richiesta o non è in grado di soddisfare la richiesta. |
| 502 | Bad Gateway | Indica che un server che funge da gateway, reverse proxy o load balancer ha ricevuto una risposta non valida dal server applicativo upstream — spesso perché quel backend è andato in crash o ha restituito un output malformato. |
| 503 | Service Unavailable | Indica che il server è temporaneamente impossibilitato a gestire la richiesta (sovraccaricato o in manutenzione). Come il 429, la risposta può includere un'intestazione Retry-After che indica a client e crawler quando riprovare, motivo per cui il 503 è il codice SEO-sicuro da usare durante i periodi di inattività pianificati. |
| 504 | Gateway Timeout | Indica che un server che funge da gateway, reverse proxy o load balancer non ha ricevuto in tempo una risposta dal server upstream. Indica un backend lento o non raggiungibile piuttosto che il proxy stesso. |
| 505 | HTTP Version Not Supported | Indica che la versione del protocollo HTTP utilizzata nella richiesta non è supportata dal server. |
| 507 | Insufficient Storage | Un codice WebDAV che indica che il server non può memorizzare la rappresentazione necessaria per completare la richiesta (è esaurito lo spazio di archiviazione). |
| 508 | Loop Detected | Un codice WebDAV che indica che il server ha rilevato un ciclo infinito durante l'elaborazione della richiesta e l'ha terminata. |
| 511 | Network Authentication Required | Indica che il client deve autenticarsi per ottenere l'accesso alla rete (spesso visibile dietro Wi-Fi con portale captive). |
Capitoli Correlati
Lo stato restituito da un server dipende spesso dalla richiesta stessa. Per approfondire, consulta:
- Metodi HTTP — GET, POST e altri, che determinano come si comportano alcuni reindirizzamenti (302 vs 307).
- Moduli HTML — come gli invii di moduli attivano richieste che possono restituire 303, 422 o 429.
- URL HTML (Uniform Resource Locators) — gli indirizzi a cui puntano i reindirizzamenti 3xx e le risposte 404.