Richiesta del Cliente HTTP Python – GET, POST

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.

Python HTTP Client Ubuntu

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