4.1 Traitement des réponses
Le module requests
offre des méthodes pratiques pour
travailler avec les réponses du serveur.
Codes de statut
En plus de la réponse, le serveur envoie également un statut de traitement de la requête.
L'information sur le statut est contenue dans les champs
status_code
et reason
. Exemple ci-dessous :
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Affiche le code de statut de la réponse
print(response.reason) # Affiche la description textuelle du statut
print(response.ok) # Retourne True si le code de statut est inférieur à 400
En-têtes
Et bien sûr, quelle requête HTTP sans en-têtes ? Si tu as besoin
des en-têtes de la requête ou de la réponse, tu peux y accéder
via le champ headers
:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Affiche les en-têtes de la réponse
print(response.headers['Content-Type']) # Affiche la valeur d'un en-tête spécifique
Corps de la réponse
La réponse du serveur peut contenir un ensemble d'octets, du texte, json
ou xml
. Si
tu sais exactement ce que tu demandes au serveur, tu peux directement
obtenir l'objet du type voulu en utilisant l'une des
méthodes/champs :
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Affiche le corps de la réponse sous forme de texte
print(response.json()) # Affiche le corps de la réponse sous forme de JSON
print(response.content) # Affiche le corps de la réponse sous forme d'octets
Tu apprendras plus en détail sur les en-têtes (headers)
et les statuts des réponses dans
les cours sur le fonctionnement du réseau.
4.2 Gestion des erreurs
Le module requests
offre des exceptions pour
gérer les erreurs.
Le standard HTTP ne prévoit pas d'exceptions, à la place il fonctionne
avec des codes d'erreur (status_code)
. Si tu veux qu'une exception Python soit
générée en cas de requête échouée, tu dois
appeler explicitement la fonction raise_for_status()
.
Exemple :
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Génère une exception pour les codes de statut 4xx et 5xx
except requests.exceptions.HTTPError as err:
print(f"Une erreur HTTP est survenue : {err}")
except Exception as err:
print(f"Une autre erreur est survenue : {err}")
else:
print("Succès !")
Tu peux en apprendre plus sur les codes d'erreur dans les cours sur le fonctionnement du réseau.
4.3 Envoi de données
Avant l'invention du JSON, les grandes quantités de données étaient envoyées via
un "formulaire". Un formulaire est un objet spécial de la page du navigateur (et
un standard de données dans HTTP). Si tu veux envoyer des données
"via un formulaire", tu dois simplement passer le paramètre
data
avec ta requête.
Important !
Les requêtes GET ne prennent pas en charge
les formulaires car elles ne contiennent pas de corps de requête. Toutes leurs données sont transmises
uniquement dans l'URL.
Envoi de données dans une requête GET
Dans une requête GET
, les données sont transmises via les paramètres de l'URL. Voici un exemple :
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Affiche l'URL avec les paramètres ajoutés
Envoi de données de formulaire
Nous utiliserons une requête POST
pour envoyer des données au serveur.
Exemple :
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Envoi de fichiers
Si tu veux envoyer des données binaires sur Internet, par exemple,
uploader une image, tu dois passer ton fichier ou tes fichiers
dans la requête à l'aide du paramètre files
.
Exemple :
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
Simple comme bonjour. Si tu veux envoyer plusieurs fichiers, tu
les listes sous n'importe quels noms dans la variable
files
.
Important !
N'oublie pas de fermer le fichier après l'avoir envoyé pour éviter les fuites de ressources.
Il est préférable d'utiliser la construction with
, qui fermera automatiquement le fichier après la fin de l'opération :
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 Connexion et autorisation
L'API (Application Programming Interface) est un ensemble de règles et de protocoles qui permettent à différents programmes de communiquer entre eux. De nombreux sites et services permettent d'envoyer des requêtes et de travailler avec leur API seulement après s'être connecté.
Après une connexion réussie, tu obtiens un objet spécial – une session (session)
, qui contient un numéro unique
de ta "session autorisée avec le serveur". Pour les requêtes ultérieures, tu devras utiliser cet objet.
Authentification
Pour te connecter au serveur, tu dois passer par l'authentification (processus de connexion), pour laquelle tu dois transmettre les informations d'identification avec la requête.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
C'est ainsi que se déroule le processus d'autorisation, mais il est généralement utilisé avec une session.
Utilisation des sessions
Les sessions permettent de conserver des paramètres entre les requêtes, tels que les cookies
ou les informations d'autorisation
de l'utilisateur.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Création de la session
session = requests.Session()
# Connexion au site
login_response = session.post('https://example.com/login', data = payload)
# Poursuite du travail avec la session de l'utilisateur connecté
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION