Client HTTP Python – Requête GET, POST

Le module HTTP de Python définit les classes qui fournissent le côté client des protocoles HTTP et HTTPS. Dans la plupart des programmes, le module HTTP n’est pas utilisé directement et est regroupé avec le module urllib pour gérer les connexions URL et interagir avec les requêtes HTTP. Aujourd’hui, nous allons apprendre comment utiliser un client HTTP Python pour envoyer une requête HTTP, puis analyser l’état de la réponse et obtenir les données du corps de la réponse.

Client HTTP Python

Dans cet article sur le module HTTP de Python, nous allons essayer de faire des connexions et des requêtes HTTP comme GET, POST et PUT. Commençons.

Établir des connexions HTTP

Commençons par la chose la plus simple que le module HTTP peut faire. Nous pouvons facilement établir des connexions HTTP avec ce module. Voici un programme d’exemple:

import http.client

connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)

Voyons la sortie de ce programme: Dans ce script, nous nous sommes connectés à l’URL sur le port 80 avec un délai spécifique.

Python HTTP GET

Maintenant, nous utiliserons un client HTTP pour obtenir une réponse et un statut à partir d’une URL. Jetons un coup d’œil à un extrait de code :

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()

Dans le script ci-dessus, nous avons utilisé une URL et vérifié le statut avec l’objet de connexion. Voyons la sortie de ce programme : N’oubliez pas de fermer une connexion une fois que vous avez terminé avec l’objet de connexion. Remarquez également que nous avons utilisé une HTTPSConnection pour établir la connexion car le site est servi via le protocole HTTPS.

Obtenez-vous une erreur SSL : CERTIFICATE_VERIFY_FAILED ?

Lorsque j’ai exécuté ce programme pour la première fois, j’ai obtenu l’erreur suivante liée aux certificats 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)
$ 

D’après la sortie, il était clair que cela avait quelque chose à voir avec les certificats SSL. Mais le certificat du site est bon, donc cela doit être quelque chose avec ma configuration. Après quelques recherches sur Google, j’ai découvert que sur MacOS, nous devons exécuter le fichier Install Certificates.command présent dans le répertoire d’installation de Python pour résoudre ce problème. L’image ci-dessous montre la sortie produite par l’exécution de cette commande, il semble qu’elle installe les derniers certificats à utiliser lors de la création de connexions SSL. Notez que j’ai obtenu cette erreur sur MacOS. Cependant, sur mon système Ubuntu, tout fonctionnait parfaitement.

Python HTTP Client Ubuntu

Obtenir la liste des en-têtes de la réponse

À partir de la réponse que nous recevons, les en-têtes contiennent généralement des informations importantes sur le type de données renvoyées par le serveur et l’état de la réponse. Nous pouvons obtenir une liste des en-têtes à partir de l’objet de réponse lui-même. Examinons un extrait de code qui est une version légèrement modifiée du dernier programme :

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))

Voyons la sortie de ce programme :

Python HTTP POST

Nous pouvons également envoyer des données en utilisant une requête POST vers une URL avec le module HTTP et obtenir une réponse. Voici un programme d’exemple :

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())

Voyons la sortie de ce programme : N’hésitez pas à utiliser la bibliothèque HTTP Bin pour essayer davantage de requêtes.

Requête PUT HTTP en Python

Bien sûr, nous pouvons également effectuer une requête PUT en utilisant le module HTTP lui-même. Nous utiliserons le dernier programme lui-même. Regardons un extrait de code:

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)

Voyons la sortie de ce programme:

Conclusion

Dans cette leçon, nous avons étudié les opérations HTTP simples qui peuvent être effectuées à l’aide du module http.client. Nous pouvons également créer un serveur http python en utilisant le module SimpleHTTPServer. Référence: Documentation de l’API

Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post