Applications pratiques et bonnes pratiques
Maintenant que vous avez appris à définir différents types d'en-têtes personnalisés, explorons quelques applications pratiques et bonnes pratiques pour travailler avec les en-têtes dans des scénarios réels.
Envoi et réception de données JSON
Lorsque vous travaillez avec des API modernes, JSON est le format de données le plus courant. Voyons comment définir correctement les en-têtes pour les requêtes JSON :
- Créez un nouveau fichier nommé
json_requests.py
- Ajoutez le code suivant :
import requests
import json
url = 'https://httpbin.org/post' ## This endpoint accepts POST requests
## Data to send
data = {
'name': 'John Doe',
'email': 'john@example.com',
'message': 'Hello, world!'
}
## Set appropriate headers for JSON
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
## Method 1: Using the json parameter (recommended)
print("Method 1: Using the json parameter")
response = requests.post(url, json=data, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json()['headers']) ## Show the headers received
print(f"\nData sent (as received by server): {response.json()['json']}")
## Method 2: Manually converting to JSON
print("\nMethod 2: Manually converting to JSON")
json_data = json.dumps(data)
response = requests.post(url, data=json_data, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json()['headers']) ## Show the headers received
print(f"\nData sent (as received by server): {response.json()['json']}")
- Exécutez le script :
python json_requests.py
Vous devriez voir une sortie similaire à :
Method 1: Using the json parameter
Status Code: 200
{'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '72', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430ab12-abc123def456'}
Data sent (as received by server): {'name': 'John Doe', 'email': 'john@example.com', 'message': 'Hello, world!'}
Method 2: Manually converting to JSON
Status Code: 200
{'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '72', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430ab13-abc123def456'}
Data sent (as received by server): {'name': 'John Doe', 'email': 'john@example.com', 'message': 'Hello, world!'}
Notez que les deux méthodes fonctionnent, mais la méthode 1 est plus pratique car la bibliothèque Requests gère la conversion JSON pour vous.
Création d'une session réutilisable avec des en-têtes par défaut
Si vous devez effectuer plusieurs requêtes avec les mêmes en-têtes, l'utilisation d'un objet Session peut vous faire gagner du temps et rendre votre code plus propre :
- Créez un nouveau fichier nommé
session_headers.py
- Ajoutez le code suivant :
import requests
## Create a session object
session = requests.Session()
## Set default headers for all requests made with this session
session.headers.update({
'User-Agent': 'MyCustomApp/1.0',
'Accept-Language': 'en-US,en;q=0.9',
'X-API-Key': 'my_session_api_key'
})
## Make a request using the session - it will include our default headers
print("First request with session:")
response = session.get('https://httpbin.org/headers')
print(response.json())
## Add a custom header just for this request
print("\nSecond request with additional header:")
response = session.get('https://httpbin.org/headers',
headers={'X-Custom-Header': 'Just for this request'})
print(response.json())
## Original headers remain unchanged for future requests
print("\nThird request (original headers only):")
response = session.get('https://httpbin.org/headers')
print(response.json())
- Exécutez le script :
python session_headers.py
Vous devriez voir une sortie similaire à :
First request with session:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab45-abc123def456'}}
Second request with additional header:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Custom-Header': 'Just for this request', 'X-Amzn-Trace-Id': 'Root=1-6430ab46-abc123def456'}}
Third request (original headers only):
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab47-abc123def456'}}
L'utilisation de sessions est une bonne pratique pour plusieurs raisons :
- Amélioration des performances (mise en commun des connexions)
- En-têtes cohérents sur les requêtes
- Gestion automatique des cookies
- Possibilité d'ajouter une personnalisation par requête si nécessaire
Bonnes pratiques pour travailler avec les en-têtes
Pour conclure, voici quelques bonnes pratiques à suivre lorsque vous travaillez avec les en-têtes HTTP :
- Utilisez des objets Session pour plusieurs requêtes vers le même domaine
- Définissez correctement les en-têtes Content-Type pour les données que vous envoyez
- Gérez correctement l'authentification - utilisez l'authentification intégrée lorsque cela est possible
- Protégez les informations sensibles - ne codez pas en dur les clés API ou les jetons
- Suivez attentivement la documentation de l'API pour les en-têtes requis
Voici un dernier exemple qui démontre ces bonnes pratiques :
- Créez un nouveau fichier nommé
best_practices.py
- Ajoutez le code suivant :
import requests
import os
## In a real application, get these from environment variables or a secure configuration
## For this example, we're keeping it simple
API_KEY = os.environ.get('API_KEY', 'default_api_key')
BASE_URL = 'https://httpbin.org'
def create_api_client():
"""Create a reusable session with default headers."""
session = requests.Session()
## Set common headers
session.headers.update({
'User-Agent': 'MyApp/1.0',
'X-API-Key': API_KEY,
'Accept': 'application/json'
})
return session
def get_data(client, endpoint):
"""Make a GET request to the specified endpoint."""
url = f"{BASE_URL}/{endpoint}"
response = client.get(url)
return response.json()
def post_data(client, endpoint, data):
"""Make a POST request with JSON data."""
url = f"{BASE_URL}/{endpoint}"
response = client.post(url, json=data)
return response.json()
## Usage example
def main():
## Create the API client
client = create_api_client()
## GET request example
print("Making GET request...")
get_response = get_data(client, 'headers')
print(f"Headers sent: {get_response['headers']}")
## POST request example
print("\nMaking POST request...")
data = {'name': 'John', 'age': 30}
post_response = post_data(client, 'post', data)
print(f"Data received by server: {post_response['json']}")
if __name__ == '__main__':
main()
- Exécutez le script :
python best_practices.py
Vous devriez voir une sortie similaire à :
Making GET request...
Headers sent: {'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'MyApp/1.0', 'X-API-Key': 'default_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab78-abc123def456'}
Making POST request...
Data received by server: {'name': 'John', 'age': 30}
Cet exemple démontre une approche structurée pour effectuer des requêtes HTTP avec des en-têtes personnalisés, en suivant les bonnes pratiques telles que la création de sessions réutilisables, l'organisation du code en fonctions et l'évitement des informations sensibles codées en dur.