Il modulo HTTP di Python definisce le classi che forniscono il lato client dei protocolli HTTP e HTTPS. Nella maggior parte dei programmi, il modulo HTTP non viene utilizzato direttamente ed è combinato con il modulo urllib
per gestire le connessioni URL e l’interazione con le richieste HTTP. Oggi impareremo come utilizzare un client HTTP di Python per inviare richieste HTTP e quindi analizzare lo stato della risposta e ottenere i dati del corpo della risposta.
Client HTTP Python
In questo post sul modulo HTTP di Python, cercheremo di effettuare connessioni e richieste HTTP come GET, POST e PUT. Iniziamo.
Effettuare Connessioni HTTP
Cominceremo con la cosa più semplice che il modulo HTTP può fare. Possiamo facilmente effettuare connessioni HTTP usando questo modulo. Ecco un programma di esempio:
import http.client
connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)
Vediamo l’output di questo programma: In questo script, ci siamo connessi all’URL sulla porta 80 con un timeout specifico.
Python HTTP GET
Ora utilizzeremo il client HTTP per ottenere una risposta e uno stato da un URL. Diamo un’occhiata a un frammento di codice:
import http.client
connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
print("Status: {} and reason: {}".format(response.status, response.reason))
connection.close()
Nello script sopra, abbiamo utilizzato un URL e controllato lo stato con l’oggetto di connessione. Vediamo l’output di questo programma: Ricorda di chiudere una connessione una volta finito con l’oggetto di connessione. Inoltre, notare che abbiamo utilizzato un
HTTPSConnection
per stabilire la connessione poiché il sito web viene servito tramite il protocollo HTTPS.
Stai ricevendo l’errore SSL: CERTIFICATE_VERIFY_FAILED?
Quando ho eseguito il programma sopra per la prima volta, ho ottenuto il seguente errore relativo ai certificati SSL.
$ python3.6 http_client.py
Traceback (most recent call last):
File "http_client.py", line 4, in <module>
connection.request("GET", "/")
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output
self.send(msg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send
self.connect()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect
server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket
context=self, session=session)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in init
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748)
$
Dall’output, era chiaro che aveva qualcosa a che fare con i certificati SSL. Ma il certificato del sito web è valido, quindi doveva essere qualcosa con la mia configurazione. Dopo qualche ricerca online, ho scoperto che su MacOS è necessario eseguire il file Install Certificates.command
presente nella directory di installazione di Python per risolvere questo problema. Di seguito è riportata un’immagine dell’output prodotto da questa esecuzione del comando, sembra che stia installando gli ultimi certificati da utilizzare durante le connessioni SSL. Nota che ho ricevuto questo errore su Mac OS. Tuttavia, sul mio sistema Ubuntu, ha funzionato perfettamente.

Ottenere l’elenco degli header dalla risposta
Dalla risposta che riceviamo, gli header di solito contengono informazioni importanti sul tipo di dati inviati dal server e lo stato della risposta. Possiamo ottenere un elenco degli header dall’oggetto di risposta stesso. Diamo un’occhiata a un frammento di codice che è una versione leggermente modificata dell’ultimo programma:
import http.client
import pprint
connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
headers = response.getheaders()
pp = pprint.PrettyPrinter(indent=4)
pp.pprint("Headers: {}".format(headers))
Vediamo l’output per questo programma:
Python HTTP POST
Possiamo anche inviare dati tramite POST a un URL con il modulo HTTP e ottenere una risposta. Ecco un programma di esempio:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request('POST', '/post', json_data, headers)
response = conn.getresponse()
print(response.read().decode())
Vediamo l’output per questo programma: Sentiti libero di utilizzare la libreria HTTP Bin per provare più richieste.
Richiesta di PUT HTTP in Python
Certo, possiamo anche eseguire una richiesta PUT utilizzando il modulo HTTP stesso. Utilizzeremo l’ultimo programma stesso. Diamo un’occhiata a un frammento di codice:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request("PUT", "/put", json_data)
response = conn.getresponse()
print(response.status, response.reason)
Vediamo l’output per questo programma:
Conclusioni
In questa lezione, abbiamo studiato operazioni HTTP semplici che possono essere eseguite utilizzando il modulo http.client
. Possiamo anche creare un server http python utilizzando il modulo SimpleHTTPServer. Riferimento: Doc API
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post