Recherche de site Web

Requête HTTP Client Python - 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 combiné avec le module urllib pour gérer les connexions URL et interagir avec les requêtes HTTP. Aujourd'hui, nous allons apprendre à utiliser un client HTTP Python pour envoyer une requête HTTP, puis analyser le statut de la réponse et obtenir les données du corps de la réponse.

Client HTTP Python

Dans ce post sur le module HTTP de Python, nous allons essayer d'établir des connexions et de faire des requêtes HTTP comme GET, POST et PUT. Commençons.

Établir des connexions HTTP

Nous allons commencer par la chose la plus simple que le module HTTP puisse faire. Nous pouvons facilement établir des connexions HTTP en utilisant ce module. Voici un programme d'exemple :

import http.client

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

Voyons le résultat de ce programme :

Dans ce script, nous nous sommes connectés à l'URL sur le port 80 avec un délai d'attente spécifique.

Python HTTP GET

Maintenant, nous allons utiliser un client HTTP pour obtenir une réponse et un statut à partir d'une URL. Regardons 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. Notez également que nous avons utilisé un HTTPSConnection pour établir la connexion, car le site Web est servi sur le protocole HTTPS.

Obtenir une erreur SSL : CERTIFICATE_VERIFY_FAILED ?

Lorsque j'ai exécuté le programme ci-dessus 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 à voir avec les certificats SSL. Mais le certificat du site Web est correct, donc cela doit avoir à voir 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 cette exécution de commande, on dirait qu'elle installe les derniers certificats à utiliser lors des connexions SSL.

Client HTTP Python Ubuntu

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

D'après la réponse que nous recevons, les en-têtes contiennent généralement également des informations importantes sur le type de données renvoyées par le serveur et le statut de la réponse également. Nous pouvons obtenir une liste d'en-têtes à partir de l'objet de réponse lui-même. Regardons 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 le résultat de ce programme :

Python HTTP POST

Nous pouvons également envoyer des données à une URL avec le module HTTP et obtenir une réponse. Voici un exemple de programme :

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 le résultat de ce programme :

N'hésitez pas à utiliser la bibliothèque HTTP Bin pour essayer d'autres requêtes.

Requête HTTP PUT en Python

Bien sûr, nous pouvons également effectuer une requête PUT en utilisant le module HTTP lui-même. Nous allons utiliser 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 le résultat de ce programme :

Conclusion

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