Le risposte HTTP sono una parte importante della comunicazione web, permettendo ai server di rispondere alle richieste dei client con i dati richiesti, informazioni sullo stato e altri dettagli chiave. Questo articolo spiegherà la struttura e le parti di una risposta HTTP, inclusa la riga di stato, gli header e il body. Vedremo i diversi gruppi di codici di stato HTTP e i loro significati, con esempi reali per mostrare come vengono utilizzati. Parleremo anche dei modi corretti per gestire le risposte HTTP nello sviluppo web, sia lato client che lato server, per assicurare una buona comunicazione tra client e server.
Punti Chiave
- Una risposta HTTP è il messaggio che un web server invia a un client dopo aver ricevuto ed elaborato una richiesta HTTP.
- I componenti chiave di una risposta HTTP includono la riga di stato, gli header e un body facoltativo che contiene il contenuto richiesto.
- I codici di stato HTTP sono categorizzati in risposte informative (1xx), risposte di successo (2xx), messaggi di reindirizzamento (3xx), risposte di errore del client (4xx) e risposte di errore del server (5xx).
- Dal lato client, è importante controllare i codici di stato, elaborare i dati della risposta in base all'header Content-Type e gestire i reindirizzamenti e gli errori in modo appropriato.
- Dal lato server, impostare i codici di stato e gli header corretti, fornire messaggi di errore chiari e implementare una corretta gestione degli errori e del logging sono aspetti fondamentali per uno sviluppo web efficace.
Cos'è una Risposta HTTP?
Una risposta HTTP è il messaggio che un web server invia a un client dopo aver ricevuto ed elaborato una richiesta HTTP. Fornisce il risultato della richiesta del client, che sia un successo, un fallimento o qualcosa nel mezzo. La risposta include informazioni sullo stato della richiesta e può anche avere contenuto nel suo body, come la risorsa richiesta (una pagina web, un'immagine, dati JSON, ecc.) o un messaggio di errore.
Le risposte HTTP sono necessarie affinché un client possa capire se la sua richiesta ha avuto successo o meno e quale sia stato il risultato di quella richiesta. I browser web usano le risposte HTTP per sapere quale contenuto mostrare agli utenti. Le API usano le risposte HTTP per indicare il risultato delle operazioni e per restituire dati. La struttura e il contenuto della risposta HTTP determinano come il client procede.
Componenti di una Risposta HTTP
Una risposta HTTP è composta da diversi componenti chiave:
- Riga di Stato: La prima riga della risposta, che include la versione HTTP, un codice di stato e un messaggio di stato.
- Header: Coppie chiave-valore che forniscono informazioni aggiuntive sulla risposta, come il tipo di contenuto, la lunghezza del contenuto, le direttive di caching e altro.
- Body (facoltativo): Il contenuto vero e proprio della risposta, come HTML, JSON, un'immagine, ecc.
Ecco un esempio di una semplice risposta HTTP:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<!DOCTYPE html>
<html>
<head>
<title>Pagina di Esempio</title>
</head>
<body>
<h1>Ciao, Mondo!</h1>
<p>Questa è una pagina di esempio.</p>
</body>
</html>
Esempi Reali
Navigazione Web: Quando inserisci un URL nel tuo browser web, questo invia una richiesta HTTP al server. Il server risponde poi con una risposta HTTP che include il contenuto HTML della pagina web. Il tuo browser usa questa risposta per visualizzare la pagina.
Interazione con API: Quando un'applicazione fa una richiesta a un endpoint API, il server API risponde con una risposta HTTP. Questa risposta spesso include dati JSON che l'applicazione può utilizzare. Per esempio, un'app meteo potrebbe fare una richiesta a un'API meteo e ricevere i dati meteo attuali nella risposta.
Download di File: Quando clicchi su un link per scaricare un file, il tuo browser invia una richiesta HTTP al server. Il server risponde con una risposta HTTP che include i dati del file nel body e header che indicano il tipo e la dimensione del file.
Componenti di una Risposta HTTP
Una risposta HTTP ha diverse parti chiave che forniscono informazioni sul risultato della richiesta e consegnano i dati richiesti.
Riga di Stato
La riga di stato è la prima riga della risposta HTTP. Include:
- Versione HTTP: Mostra la versione del protocollo HTTP utilizzata, come HTTP/1.1 o HTTP/2.
- Codice di Stato: Un numero di tre cifre che indica il risultato della richiesta, come 200 per successo, 404 per "non trovato" o 500 per un errore del server.
- Testo di Stato: Una breve descrizione del codice di stato, come "OK" per 200, "Not Found" per 404 o "Internal Server Error" per 500.
Ecco alcuni codici di stato HTTP comuni e i loro significati:
| Codice di Stato | Testo di Stato | Significato |
|---|---|---|
| 200 | OK | La richiesta ha avuto successo e il body della risposta contiene i dati. |
| 201 | Created | La richiesta ha avuto successo ed è stata creata una nuova risorsa. |
| 301 | Moved Permanently | La risorsa richiesta è stata spostata permanentemente a un nuovo URL. |
| 400 | Bad Request | Il server non ha potuto comprendere la richiesta a causa di una sintassi non valida. |
| 401 | Unauthorized | La richiesta richiede l'autenticazione dell'utente. |
| 404 | Not Found | Il server non ha potuto trovare la risorsa richiesta. |
| 500 | Internal Server Error | Il server ha riscontrato un errore imprevisto. |
Il codice di stato HTTP fa parte del messaggio di risposta. Definisce la classe di risposta e svolge un ruolo di categorizzazione. La prima cifra del codice di stato indica il tipo di risposta:
- 1xx: Risposta informativa
- 2xx: Successo
- 3xx: Reindirizzamento
- 4xx: Errore del client
- 5xx: Errore del server
I codici di stato HTTP sono estensibili, ma le applicazioni HTTP non sono tenute a comprendere il significato di tutti i codici di stato registrati. Informazioni aggiuntive sulla risposta possono essere trovate nei campi header della risposta.
Header di Risposta
Dopo la riga di stato ci sono gli header di risposta. Sono coppie chiave-valore che forniscono maggiori dettagli sulla risposta. Alcuni header comuni includono:
- Server: Il tipo di server che ha generato la risposta, come "Apache/2.4.41 (Ubuntu)".
- Content-Type: Il tipo MIME dei dati nel body della risposta, come "text/html" per HTML o "application/json" per JSON.
- Content-Length: La dimensione del body della risposta in byte.
- Cache-Control: Direttive per i meccanismi di caching, specificando se la risposta può essere memorizzata in cache, per quanto tempo, ecc. Per esempio, "max-age=3600" significa che la risposta può essere memorizzata in cache per un'ora.
- Set-Cookie: Invia cookie dal server al client, come "session_id=abc123; Expires=Wed, 21 Jun 2023 07:28:00 GMT".
Riga Vuota
Dopo gli header, c'è una riga vuota. Questa riga vuota segnala la fine della sezione degli header della risposta.
Body della Risposta
Dopo la riga vuota c'è il body della risposta. Contiene i dati effettivi che sono stati richiesti, come:
Un file HTML per una pagina web:
<!DOCTYPE html> <html> <head> <title>Pagina di Esempio</title> </head> <body> <h1>Benvenuto nella Pagina di Esempio</h1> <p>Questo è un esempio di body di risposta HTML.</p> </body> </html>Dati JSON per una risposta API:
{ "name": "Mario Rossi", "age": 30, "city": "Roma" }Un'immagine, un video o altri file multimediali.
Un file da scaricare, come un PDF o un archivio ZIP.
Se la risposta indica un errore, come un codice di stato 404 o 500, il body potrebbe contenere un messaggio di errore che fornisce maggiori dettagli sul problema, come:
<!DOCTYPE html>
<html>
<head>
<title>404 Non Trovato</title>
</head>
<body>
<h1>404 Non Trovato</h1>
<p>La risorsa richiesta non è stata trovata su questo server.</p>
</body>
</html>
Il body della risposta è facoltativo. Per alcune richieste, come una richiesta HEAD o una risposta 204 "No Content", non ci sarà alcun body.
Categorie dei Codici di Stato delle Risposte HTTP
I codici di stato delle risposte HTTP sono divisi in cinque categorie in base alla loro prima cifra. Ogni categoria rappresenta una diversa classe di risposte.
Risposte informative (100-199)
I codici di stato nell'intervallo 100-199 significano che il server ha ricevuto la richiesta e la sta elaborando. Questi codici sono risposte. Alcuni codici di stato informativi comuni includono:
| Codice di Stato | Descrizione |
|---|---|
100 Continue |
Il server ha ricevuto gli header della richiesta e il client dovrebbe inviare il body della richiesta. |
102 Processing |
Il server ha ricevuto e sta elaborando la richiesta, ma non è ancora disponibile alcuna risposta. |
Scenario di esempio:
- Un client invia una richiesta POST con un payload grande. Il server risponde con un codice di stato
100 Continueper dire al client di inviare il body della richiesta.
Risposte di successo (200-299)
I codici di stato nell'intervallo 200-299 significano che il server ha ricevuto, compreso e accettato la richiesta. Alcuni codici di stato di successo comuni includono:
| Codice di Stato | Descrizione |
|---|---|
200 OK |
La richiesta ha avuto successo e il body della risposta contiene i dati richiesti. |
201 Created |
La richiesta ha avuto successo ed è stata creata una nuova risorsa. Questo è comunemente usato come risposta a una richiesta POST. |
204 No Content |
Il server ha soddisfatto la richiesta ma non ha bisogno di restituire alcun contenuto. |
Scenari di esempio:
- Un client richiede una pagina web usando una richiesta GET. Il server risponde con un codice di stato
200 OKe restituisce il contenuto HTML. - Un client invia un modulo per creare una nuova risorsa usando una richiesta POST. Il server crea la risorsa e risponde con un codice di stato
201 Created. - Un client invia una richiesta DELETE per rimuovere una risorsa. Il server elimina la risorsa e risponde con un codice di stato
204 No Content.
Messaggi di reindirizzamento (300-399)
I codici di stato nell'intervallo 300-399 significano che il client deve intraprendere ulteriori azioni per completare la richiesta. L'azione può essere eseguita dall'user agent senza interazione con l'utente. Alcuni codici di stato di reindirizzamento comuni includono:
| Codice di Stato | Descrizione |
|---|---|
301 Moved Permanently |
Alla risorsa richiesta è stato assegnato un nuovo URI permanente e i riferimenti futuri dovrebbero usare uno degli URI restituiti. |
302 Found |
La risorsa richiesta si trova sotto un URI diverso. Il client dovrebbe continuare a usare il Request-URI per richieste future. |
304 Not Modified |
La risorsa non è stata modificata dalla versione specificata dagli header della richiesta, quindi il client può continuare a usare la versione in cache. |
Scenari di esempio:
- Un client richiede una risorsa che è stata spostata permanentemente a un nuovo URL. Il server risponde con un codice di stato
301 Moved Permanentlye include il nuovo URL nell'headerLocation. - Un client richiede una risorsa che si trova sotto un URL diverso. Il server risponde con un codice di stato
302 Founde include l'URL temporaneo nell'headerLocation. - Un client invia una richiesta GET condizionale con l'header
If-Modified-Since. Se la risorsa non è stata modificata dalla data specificata, il server risponde con un codice di stato304 Not Modified.
Risposte di errore del client (400-499)
I codici di stato nell'intervallo 400-499 significano che il client sembra aver commesso un errore. Tranne quando si risponde a una richiesta HEAD, il server dovrebbe includere un'entità che spieghi l'errore. Alcuni codici di stato di errore del client comuni includono:
| Codice di Stato | Descrizione |
|---|---|
400 Bad Request |
Il server non ha potuto comprendere la richiesta a causa di una sintassi errata. |
401 Unauthorized |
La richiesta richiede l'autenticazione dell'utente. |
404 Not Found |
Il server non ha trovato nulla che corrisponda al Request-URI. |
Scenari di esempio:
- Un client invia una richiesta con parametri non validi o mancanti. Il server risponde con un codice di stato
400 Bad Requeste include un messaggio di errore nel body della risposta. - Un client cerca di accedere a una risorsa protetta senza fornire un'autenticazione valida. Il server risponde con un codice di stato
401 Unauthorizede richiede al client di autenticarsi. - Un client richiede una risorsa che non esiste sul server. Il server risponde con un codice di stato
404 Not Found.
Risposte di errore del server (500-599)
I codici di stato nell'intervallo 500-599 significano che il server sa di aver commesso un errore o non è in grado di eseguire la richiesta. Tranne quando si risponde a una richiesta HEAD, il server dovrebbe includere un'entità che spieghi l'errore e se si tratta di una condizione temporanea o permanente. Alcuni codici di stato di errore del server comuni includono:
| Codice di Stato | Descrizione |
|---|---|
500 Internal Server Error |
Il server ha riscontrato una condizione imprevista che gli ha impedito di soddisfare la richiesta. |
503 Service Unavailable |
Il server attualmente non è in grado di gestire la richiesta a causa di un sovraccarico temporaneo o della manutenzione del server. |
504 Gateway Timeout |
Il server, mentre agisce come gateway o proxy, non ha ricevuto una risposta tempestiva dal server upstream a cui doveva accedere per completare la richiesta. |
Scenari di esempio:
- Un client richiede una risorsa, ma si verifica un errore imprevisto sul lato server. Il server risponde con un codice di stato
500 Internal Server Errore registra l'errore per l'analisi. - Un client cerca di accedere a un servizio che è temporaneamente fuori servizio per manutenzione. Il server risponde con un codice di stato
503 Service Unavailablee può includere un headerRetry-Afterper indicare quando il servizio dovrebbe essere nuovamente disponibile. - Un client richiede una risorsa che richiede al server di comunicare con un server upstream. Se il server upstream impiega troppo tempo a rispondere, il server invia un codice di stato
504 Gateway Timeoutal client.
Per maggiori informazioni sui codici di stato HTTP, puoi consultare le seguenti risorse:
Gestione delle Risposte HTTP nello Sviluppo Web
Quando crei applicazioni web, devi gestire correttamente le risposte HTTP sia lato client che lato server. Questo aiuta a creare una buona esperienza utente e facilita il debugging e la manutenzione dell'applicazione.
Lato Client
Dal lato client, come in un browser web o in un'app mobile, devi:
Controllare i codici di stato: Dopo aver inviato una richiesta HTTP, il client dovrebbe controllare il codice di stato HTTP della risposta per vedere se la richiesta ha funzionato o meno. Per esempio:
Codice di Stato Significato 200 OK Successo 404 Risorsa richiesta non trovata Elaborare i dati della risposta: In base al codice di stato e al campo header
Content-Type, il client deve elaborare il body della risposta nel modo giusto. Per esempio:Content-Type Azione HTML Il browser lo visualizzerà JSON Analizzare in un oggetto per ulteriore utilizzo Gestire reindirizzamenti ed errori: Se il codice di stato indica un reindirizzamento (codici 3xx), il client dovrebbe seguire il nuovo URL nell'header
Location. Per i codici di errore del client (4xx) e del server (5xx), il client dovrebbe mostrare messaggi di errore all'utente e magari ritentare la richiesta o chiedere all'utente di fare qualcosa.
Esempio di gestione di un messaggio di risposta HTTP in JavaScript usando la Fetch API:
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error(`Errore HTTP! stato: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log(data);
// Elabora i dati
})
.catch(error => {
console.error('Errore:', error);
// Gestisci l'errore
});
Lato Server
Dal lato server, devi:
Impostare i codici di stato e gli header giusti: Quando invii una risposta, il web server dovrebbe impostare il codice di stato HTTP corretto per mostrare il risultato dell'elaborazione della richiesta. Dovrebbe anche includere campi header di risposta, come
Content-Type, per aiutare il client a comprendere correttamente la risposta.Fornire messaggi di errore chiari: Per le risposte di errore del client e del server, il server dovrebbe includere un messaggio di errore chiaro e conciso nel body della risposta. Questo aiuta gli sviluppatori a capire cosa è andato storto e come risolverlo.
Implementare una buona gestione degli errori e del logging: Sul server, è importante rilevare e gestire bene gli errori. Questo significa registrare gli errori per analisi e debugging successivi, e non mostrare dati sensibili nei messaggi di errore inviati al client.
Esempio di invio di una risposta HTTP in Node.js usando Express:
app.get('/data', (req, res) => {
try {
const data = getDataFromDatabase();
res.status(200).json(data);
} catch (error) {
console.error('Errore:', error);
res.status(500).json({ error: 'Errore Interno del Server' });
}
});





