5.1 Introduzione a HttpClient
In Python, come in molti linguaggi di programmazione, c'è un HttpClient standard. In Python si chiama http.client e permette di eseguire richieste HTTP a basso livello e lavorare con le risposte HTTP. Permette di creare connessioni a server HTTP e interagire con essi.
Un modulo a basso livello come http.client offre un controllo più dettagliato sulle operazioni HTTP, ma richiede più codice per eseguire i compiti. Al contrario, moduli ad alto livello come requests, offrono un'interfaccia più semplice nascondendo molti dettagli di implementazione.
Funzionalità principali di http.client
Il modulo http.client offre le seguenti principali funzionalità:
- Creazione di connessioni HTTP.
- Invio di richieste HTTP.
- Lettura di risposte HTTP.
- Gestione di header e body delle richieste e risposte.
A differenza del modulo requests, il modulo http.client è più a basso livello e mette molta attenzione ai dettagli del funzionamento della richiesta http.
Classi e metodi principali di http.client
| Classe/Metodo | Descrizione |
|---|---|
HTTPConnection |
Creazione di una connessione HTTP. |
HTTPSConnection |
Creazione di una connessione HTTPS. |
request(method, url, ...) |
Invio di una richiesta HTTP. |
getresponse() |
Ottenere la risposta di una richiesta. |
response.status |
Codice di stato della risposta. |
response.reason |
Descrizione testuale dello stato della risposta. |
response.read() |
Lettura dei dati della risposta. |
response.getheaders() |
Ottenere tutti gli header della risposta. |
response.getheader(name) |
Ottenere il valore di un header specifico. |
Di seguito esamineremo alcuni di essi in dettaglio.
5.2 Esecuzione di una GET request
Per eseguire richieste usando la libreria http.client, devi seguire questo ordine di azioni:
Stabilire una connessione
Inviare una richiesta
Ricevere una risposta
Chiudere la connessione
È importante notare che chiudere la connessione dopo l'uso è necessario per liberare risorse e prevenire perdite di memoria. Questo è particolarmente importante quando si lavora con un gran numero di richieste o in applicazioni a lunga durata.
Esempio di utilizzo di HTTPConnection per una richiesta HTTP normale:
import http.client
# Creazione di una connessione HTTP
conn = http.client.HTTPConnection("example.com")
# Invio di una richiesta GET
conn.request("GET", "/")
# Ottenere la risposta
response = conn.getresponse()
print(response.status, response.reason)
# Chiusura della connessione
conn.close()
Esempio di utilizzo di HTTPSConnection:
import http.client
# Creazione della connessione
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Invio di una richiesta GET
conn.request("GET", "/posts/1")
# Ottenere la risposta
response = conn.getresponse()
print(response.status, response.reason)
# Lettura e decodifica dei dati della risposta
data = response.read().decode('utf-8')
print(data)
# Ottenere tutti gli header della risposta
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# Chiusura della connessione
conn.close()
Un po' più lungo rispetto all'uso di requests, non è vero?
5.3 Esecuzione di una POST request
Una POST request utilizzando http.client viene eseguita in modo molto simile a una GET request, solo che i dati devono essere confezionati in una stringa json manualmente, e bisogna specificare manualmente il tipo di dati trasmessi – aggiungere un header Content-Type.
Esempio:
import http.client
import json
# Invio della richiesta POST
conn.request("POST", "/posts", body=payload, headers=headers)
Come body bisogna passare un oggetto json, serializzato in una stringa, e come headers — un dizionario che contiene informazioni sul tipo di dati.
Possono apparire, ad esempio, così:
# Dati da inviare
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Headers – tipo di contenuto trasmesso
headers = {
'Content-Type': 'application/json'
}
Allora il codice completo della POST request apparirà così:
import http.client
import json
# Dati da inviare
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# Headers
headers = {
'Content-Type': 'application/json'
}
# Creazione della connessione
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Invio della richiesta POST
conn.request("POST", "/posts", body=payload, headers=headers)
# Ottenere la risposta
response = conn.getresponse()
print(response.status, response.reason)
# Lettura e decodifica dei dati della risposta
data = response.read().decode('utf-8')
print(data)
# Chiusura della connessione
conn.close()
5.4 Gestione degli errori durante l'esecuzione delle richieste
Penso che sarà utile fornire un esempio di gestione degli errori, dato che è diverso dal comportamento di requests. Nel modulo http.client un'eccezione viene sollevata automaticamente, se ci sono stati problemi con la connessione o altri errori HTTP.
Esempio:
import http.client
try:
# Creazione della connessione
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Invio di una richiesta GET
conn.request("GET", "/posts/1")
# Ottenere la risposta
response = conn.getresponse()
print(response.status, response.reason)
# Lettura e decodifica dei dati della risposta
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("HTTP error occurred:", e)
except Exception as e:
print("An error occurred:", e)
finally:
# Chiusura della connessione
conn.close()
Che dire? Usare il modulo requests è sicuramente più semplice. Ma! Molti moduli e framework usano sotto il cofano proprio il http.client a basso livello. Devi sapere come lavorarci, così puoi configurare correttamente il loro funzionamento.
GO TO FULL VERSION