
Ogni errore HTTP è una risposta di una riga a una domanda che nessuno ha posto ad alta voce: cosa è successo alla mia richiesta? Il numero è tutta la risposta, ed è deliberatamente scarno, quindi gran parte del lavoro sta nel sapere a quale domanda risponde ciascun numero.
È a questo che serve questa pagina. Non un elenco di tutti i sessanta e passa codici di stato, la maggior parte dei quali non vedrete mai, ma la dozzina abbondante che arriva davvero alle persone, ordinata per quello che vi dice su dove è stato il guasto.
L’unica divisione che conta
La prima cifra è l’unica parte del codice che dovete ricordare.
- 4xx
- Il server vi ha capito e si rifiuta, oppure non è riuscito ad analizzare ciò che è arrivato. Il problema sta nella richiesta
- 5xx
- La richiesta andava bene. Il server non è riuscito a produrre una risposta, o ha scelto di non farlo
Tutto il resto discende da lì. Un 4xx vi manda a guardare ciò che è stato inviato: l’URL, gli header, il corpo, le credenziali. Un 5xx vi manda nei log del server e, se il server non è vostro, potete fare ben poco oltre a segnalarlo bene.
La parola “client” in “errore del client” è il punto in cui le persone si perdono, quindi vale la pena dirlo chiaramente: il client non siete voi. Il client è il software che ha composto la richiesta, e su un sito moderno quello è quasi sempre il JavaScript della pagina stessa. Un 4xx sul sito di qualcun altro di solito è il loro bug con sopra il vostro nome.
I codici 4xx che incontrerete davvero
400 Bad Request è il server che non riesce proprio ad analizzare quello che è arrivato. È l’unico di questa famiglia che riguarda la forma della richiesta invece del permesso o dell’esistenza. Un corpo malformato, un content type mancante, un URL non codificato. Ce n’è una sola versione che potete sistemare voi: un blocco di cookie cresciuto troppo, cosa che una finestra privata conferma in pochi secondi.
401 e 403 sono i due che vengono scambiati di continuo. 401 vuol dire che il server non sa chi siete e vuole delle credenziali. 403 vuol dire che sa esattamente chi siete e la risposta resta no. Mandare credenziali migliori risolve il primo e non risolve mai il secondo.
404 Not Found non ha bisogno di spiegazioni, ma una cosa vale la pena saperla: un 404 su una richiesta che la pagina ha fatto in background, e non nella barra degli indirizzi, di solito significa che una build o un deploy ha perso un file, non che qualcuno ha digitato male.
429 Too Many Requests è l’unico codice di stato che riguarda il vostro comportamento invece del server o della risorsa. È anche l’unico errore in cui riprovare peggiora le cose, perché un nuovo tentativo è un’altra richiesta che il limiter conta.
I codici 5xx, che sembrano identici e significano cose diverse
Tutti e quattro dicono “da parte nostra”, e distinguerli decide dove guarda per primo chiunque.
- 500 Internal Server Error
- L'applicazione è girata e il suo stesso codice ha fallito. Un'eccezione non gestita. Ha risposto, e la risposta era un errore che si è fatta da sola
- 502 Bad Gateway
- Un server davanti ha ricevuto una risposta inutilizzabile dall'applicazione che ha dietro. Il guasto sta fra due server
- 503 Service Unavailable
- Qualcosa ha scelto di non servirvi. Manutenzione, capacità, un rate limiter, o niente di sano verso cui instradare
- 504 Gateway Timeout
- L'applicazione non ha mai risposto in tempo. Il server davanti ha smesso di aspettare
La scorciatoia utile: un
500 è codice che si rompe
mentre gira, un 502 è un proxy che
non ha ottenuto una buona risposta, un
504 è l’applicazione troppo
lenta, e un
503 è l’unico che di solito
è voluto. Quest’ultima distinzione conta più di quanto sembri: un 503 spesso porta un header
Retry-After che dice esattamente quando tornare, e quasi nessuno lo legge.
Gli errori che non sono affatto codici di stato
Alcuni dei fallimenti più comuni non producono mai un codice di stato, ed è proprio per questo che confondono. La richiesta non è fallita; non si è mai completata.
TypeError: Failed to fetch è l’errore meno informativo di JavaScript. Non c’è nessuno stato da leggere perché la richiesta non è mai arrivata abbastanza lontano da averne uno.
Gli errori CORS sono il browser che si rifiuta di consegnare al vostro codice una risposta che invece è arrivata. Il server ha risposto benissimo; semplicemente non ha detto che la vostra origine era permessa.
ERR_CONNECTION_REFUSED, RESET, CLOSED e TIMED_OUT succedono del tutto sotto HTTP. Ciascuno nomina fin dove è arrivata la connessione prima di morire, che è gran parte di una diagnosi in regalo.
Il contenuto misto è il browser che blocca una risorsa non sicura su una pagina sicura. Non è fallito niente sulla rete; è stata applicata una regola.
Leggerne uno che non è vostro
Se siete visitatori e non la persona che può sistemarlo, tre controlli separano la maggior parte dei casi e richiedono meno di un minuto.
Ricaricate una volta. Parecchi 500 e 503 sono un singolo brutto momento. Se si risolve, non c’è niente da inseguire.
Provate una finestra privata. È il test per la famiglia cookie e header: un 400 che sparisce in privato era un blocco di cookie troppo grande, e uno che non sparisce non è mai stato vostro.
Provate un’altra rete. Un telefono in rete mobile risponde alla domanda che pone un rate limiter. Se l’errore vi segue ovunque è il vostro account o il sito; se sparisce, era l’indirizzo da cui arrivavate. È la stessa domanda del distinguere il vostro bug dal loro disservizio, posta in fretta.
Perché il codice da solo basta di rado a sistemare qualcosa
Ogni errore qui sopra è un riassunto a cui sono state tolte le prove. Non è un caso: un 500 è vago apposta, perché lo stack trace resta sul server, e un 400 non vi dirà quale header lo ha offeso. Il codice nomina la categoria e tace il caso.
Quindi “ho preso un 500” è una segnalazione che a uno sviluppatore non dice quasi nulla e, quando qualcuno va a indagare, la richiesta fallita non c’è più. Quello che ne chiude uno in fretta è la richiesta fallita stessa, il suo orario esatto, e cosa stava facendo la persona.
Session Replay
Estensione Chrome gratuita. Un clic sulla pagina che si comporta male cattura lo screenshot, la console e il log di rete, e vi dà un link da incollare nel ticket.
Il log di rete è dove un codice di stato smette di essere una categoria e diventa un caso: la richiesta che ha preso l’errore, i suoi header e il suo corpo, e il minuto esatto, così chi la prende in carico può confrontarla con un log del server invece di riprodurre prima tutto quanto.
In un paragrafo
La prima cifra è la divisione che conta: un 4xx significa che il problema sta nella richiesta, un 5xx che il server non è riuscito a rispondere, e il “client” incolpato da un 4xx di solito è il JavaScript del sito e non voi. Dentro i 4xx, il 400 riguarda la forma della richiesta, il 401 e il 403 l’identità contro il permesso, e il 429 quanto spesso avete chiesto. Dentro i 5xx, il 500 è codice che si rompe, il 502 un proxy con una risposta cattiva, il 504 niente che risponda in tempo, e il 503 l’unico che di solito è una decisione. Gli errori senza alcun codice di stato, come failed to fetch, CORS, ERR_CONNECTION_* o il contenuto misto, sono quelli che confondono di più, perché la richiesta non si è mai completata invece di fallire. Qualunque sia il vostro, il codice nomina la categoria e tace il caso, quindi catturate la richiesta fallita finché ce l’avete.