5.1 Introduction à HttpClient
En Python, comme dans de nombreux langages de programmation, il existe un
HttpClient standard. En Python, il s'appelle http.client
et permet
d'effectuer des requêtes HTTP de bas niveau et de travailler avec les réponses HTTP. Il
permet de créer des connexions aux serveurs HTTP et d'interagir
avec eux.
Un module de bas niveau, comme http.client
, offre un contrôle plus détaillé sur les opérations HTTP,
mais nécessite plus de code pour effectuer des tâches. Contrairement à lui, les modules de haut niveau, comme requests
,
offrent une interface plus simple, cachant de nombreux détails d'implémentation.
Fonctionnalités principales de http.client
Le module http.client
offre les fonctionnalités principales suivantes :
- Création de connexions HTTP.
- Envoi de requêtes HTTP.
- Lecture des réponses HTTP.
- Traitement des en-têtes et du corps des requêtes et réponses.
Contrairement au module requests
, le module http.client
est plus
bas niveau et accorde beaucoup d'attention aux nuances du
fonctionnement des requêtes http.
Principales classes et méthodes de http.client
Classe/Méthode | Description |
---|---|
HTTPConnection |
Création d'une connexion HTTP. |
HTTPSConnection |
Création d'une connexion HTTPS. |
request(method, url, ...) |
Envoi d'une requête HTTP. |
getresponse() |
Obtenir la réponse à la requête. |
response.status |
Code d'état de la réponse. |
response.reason |
Description textuelle de l'état de la réponse. |
response.read() |
Lecture des données de la réponse. |
response.getheaders() |
Obtenir tous les en-têtes de la réponse. |
response.getheader(name) |
Obtenir la valeur d'un en-tête spécifique. |
Nous allons examiner certains d'entre eux plus en détail ci-dessous.
5.2 Exécution d'une requête GET
Pour effectuer des requêtes en utilisant la bibliothèque http.client
,
il faut suivre l'ordre des actions suivant :
Établir une connexion
Envoyer la requête
Recevoir la réponse
Fermer la connexion
Il est important de noter que fermer la connexion après utilisation est nécessaire pour libérer les ressources et éviter les fuites de mémoire. C'est particulièrement important lors du traitement d'une grande quantité de requêtes ou dans des applications de longue durée.
Exemple d'utilisation de HTTPConnection
pour une requête HTTP classique :
import http.client
# Création d'une connexion HTTP
conn = http.client.HTTPConnection("example.com")
# Envoi de la requête GET
conn.request("GET", "/")
# Recevoir la réponse
response = conn.getresponse()
print(response.status, response.reason)
# Fermeture de la connexion
conn.close()
Exemple d'utilisation de HTTPSConnection
:
import http.client
# Création de la connexion
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envoi de la requête GET
conn.request("GET", "/posts/1")
# Recevoir la réponse
response = conn.getresponse()
print(response.status, response.reason)
# Lecture et décodage des données de la réponse
data = response.read().decode('utf-8')
print(data)
# Obtenir tous les en-têtes de la réponse
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# Fermeture de la connexion
conn.close()
Un peu plus long qu'en utilisant requests
, n'est-ce pas ?
5.3 Exécution d'une requête POST
Une requête POST
avec http.client
est réalisée de manière très similaire à
une requête GET
, sauf que tu dois emballer les données dans une chaîne json
toi-même et indiquer manuellement le type de données transmises — ajouter un en-tête Content-Type
.
Exemple :
import http.client
import json
# Envoi de la requête POST
conn.request("POST", "/posts", body=payload, headers=headers)
Pour le body
tu dois passer un objet json
, sérialisé en chaîne,
et pour les headers
— un dictionnaire contenant des informations sur le type de données.
Ils pourraient ressembler, par exemple, à ceci :
# Données à envoyer
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# En-têtes – type de contenu transmis
headers = {
'Content-Type': 'application/json'
}
Alors le code complet de la requête POST
sera comme ceci :
import http.client
import json
# Données à envoyer
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# En-têtes
headers = {
'Content-Type': 'application/json'
}
# Création de la connexion
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envoi de la requête POST
conn.request("POST", "/posts", body=payload, headers=headers)
# Recevoir la réponse
response = conn.getresponse()
print(response.status, response.reason)
# Lecture et décodage des données de la réponse
data = response.read().decode('utf-8')
print(data)
# Fermeture de la connexion
conn.close()
5.4 Gestion des erreurs lors de l'exécution des requêtes
Je pense qu'il serait également utile de donner un exemple de gestion des erreurs, car il
diffère du comportement de requests
. Dans le module http.client
, une exception
est levée automatiquement
s'il y a eu
des problèmes de connexion ou d'autres erreurs HTTP.
Exemple :
import http.client
try:
# Création de la connexion
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# Envoi de la requête GET
conn.request("GET", "/posts/1")
# Recevoir la réponse
response = conn.getresponse()
print(response.status, response.reason)
# Lecture et décodage des données de la réponse
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("Erreur HTTP s'est produite:", e)
except Exception as e:
print("Une erreur s'est produite:", e)
finally:
# Fermeture de la connexion
conn.close()
Que dire ? L'utilisation du module requests est évidemment plus simple. Mais ! De nombreux modules et frameworks utilisent sous le capot le client http de bas niveau. Vous devez savoir comment l'utiliser, afin de configurer correctement leur fonctionnement.
GO TO FULL VERSION