HTTP è la chiave della comunicazione su Internet. I metodi del protocollo HTTP permettono ai client di inviare richieste ai server e ai server di inviare risposte. Ogni sito web sul World Wide Web utilizza richieste HTTP, quindi è essenziale comprenderle.
Questo articolo analizza il concetto di richieste HTTP, la loro struttura, i metodi più comuni e alcuni esempi pratici per comprendere meglio il funzionamento del web.
Una richiesta HTTP è un messaggio in cui un client — ad esempio un browser — chiede a un host presente su un server una risorsa specifica. I client utilizzano gli URL nelle richieste HTTP per indicare al server quali risorse desiderano recuperare.
Ogni richiesta HTTP è composta da tre parti:
la request line (riga di richiesta)
gli header
il message body (corpo del messaggio)
La request line è la prima riga di una richiesta HTTP. Serve per iniziare un’azione sul server. Indica il metodo HTTP e la versione del protocollo. Include anche un’URI o un URL.
Esempio:
GET /index.html HTTP/1.1
Gli header seguono immediatamente la request line.
Forniscono informazioni aggiuntive dal client al server, come:
nome dell’host
informazioni sul browser (User-Agent)
preferenze linguistiche
tipi di contenuto accettati
Il server utilizza questi dati per identificare il browser e il sistema operativo del client. Gli header HTTP sono case-sensitive e seguono la sintassi Nome: Valore.
Esempio di header:
Host: example.com
User-Agent: Mozilla/5.0 (...)
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Il corpo del messaggio è utilizzato per inviare dati al server. È facoltativo: non tutte le richieste HTTP lo includono. Tipicamente viene utilizzato con i metodi POST e PUT. Il server utilizza i dati ricevuti per processare la richiesta.
Una richiesta HTTP connette un client a un server per svolgere diverse operazioni:
recuperare una risorsa
inviare dati
aggiornare contenuti
eliminare risorse
I metodi più diffusi sono i seguenti:
La richiesta GET chiede al server una risorsa. Ogni volta che visiti una pagina web, il browser invia una richiesta GET per ottenere i dati necessari.
Caratteristiche:
cacheable
safe
idempotente
GET non modifica il contenuto del server, permette solo di leggerlo.
POST viene utilizzato per inviare dati al server, ad esempio quando si compila un modulo o si carica un file.
Il body contiene i dati inviati. Più richieste POST identiche possono creare risorse multiple sul server.
PUT funziona in modo simile a POST, ma serve per aggiornare dati esistenti.
Differenze principali:
POST = crea nuovi dati
PUT = aggiorna dati esistenti
PUT è idempotente, quindi eseguire più volte la stessa richiesta produce sempre lo stesso risultato.
DELETE chiede al server di eliminare una risorsa.
Se l’operazione va a buon fine, il server invia una conferma. DELETE è idempotente.
Una risposta HTTP è il messaggio che il server invia al client dopo aver ricevuto una richiesta.
Ha una struttura simile a quella della richiesta, con tre parti:
status line
header
message body
Indica:
la versione HTTP utilizzata
il codice di stato
il messaggio corrispondente
Contengono informazioni quali:
data e ora della risposta
tipo di contenuto inviato
dettagli del server
istruzioni di caching
Contiene i dati inviati dal server, come:
HTML
JSON
XML
immagini
file
I codici HTTP indicano il risultato della richiesta. Ogni codice ha tre cifre; la prima indica la categoria.
|
Codice |
Descrizione |
|
1xx |
Risposte informative |
|
2xx |
Successo — richiesta elaborata correttamente |
|
3xx |
Reindirizzamento — sono necessarie ulteriori azioni |
|
4xx |
Errori lato client |
|
5xx |
Errori lato server |
Gli header sono fondamentali per la comunicazione client–server. Essi forniscono informazioni usate per diverse funzioni web.
Indica quale dominio è servito dal server.
Cache-Control e Expires gestiscono come memorizzare le risposte.
Set-Cookie e Cookie gestiscono le sessioni utente.
Esempi:
Authorization — autenticazione
Content-Security-Policy — protezione contro XSS
Gli header indicano se la richiesta ha avuto successo o no.
Questi esempi utilizzano Python e la libreria requests.
import requests
response = requests.get("https://api.example.com/data",
params={"param1": "value1", "param2": "value2"})
print(response.status_code)
print(response.json())
import requests
url = "https://api.example.com/users"
data = {
"username": "newuser",
"email": "newuser@example.com",
"password": "securepassword"
}
response = requests.post(url, json=data)
if response.status_code == 201:
print("User created successfully:", response.json())
else:
print("Error:", response.status_code, response.text)
import requests
url = "https://api.example.com/users/123"
data = {
"username": "updateduser",
"email": "updateduser@example.com"
}
response = requests.put(url, json=data)
if response.status_code == 200:
print("User updated successfully:", response.json())
else:
print("Error:", response.status_code, response.text)
import requests
url = "https://api.example.com/users/123"
response = requests.delete(url)
if response.status_code == 204:
print("User deleted successfully.")
else:
print("Error:", response.status_code, response.text)
Le richieste HTTP svolgono un ruolo fondamentale nelle interazioni web. È quindi essenziale comprendere i vari metodi e il loro funzionamento. Scegliere il metodo più adatto garantisce una comunicazione fluida e migliora l’efficienza delle applicazioni web.