Vérifier et décoder la réponse
Objectif : Contrôler le statut HTTP et extraire le taux de change attendu depuis le corps JSON reçu.
Une requête HTTP peut recevoir une réponse sans que l’API ait fourni les données attendues. Si vous lisez directement son contenu, un statut d’erreur ou un format inattendu risque de produire un résultat trompeur. Vous allez vérifier le statut avant de décoder le JSON, puis extraire le taux demandé.
Vérifier le statut avant de lire les données
Dans la leçon précédente, vous avez construit une requête GET avec un délai d’attente et obtenu une réponse brute. Cette réponse contient notamment un statut HTTP et un corps. La méthode raise_for_status() signale les statuts d’erreur HTTP en levant une exception ; appelez-la avant de lire les données pour ne pas traiter une réponse d’erreur comme un résultat valide.
Après cette vérification, response.json() décode le corps JSON et retourne des objets Python, ici des dictionnaires imbriqués. L’API Frankfurter renvoie le taux dans le dictionnaire rates, sous une clé correspondant à la devise cible. La fonction ci-dessous renvoie ce taux sous forme de nombre.
Mettre à jour depenses/change.py
Conservez obtenir_reponse_taux et ajoutez une fonction qui transforme la réponse brute en taux. Le bloc principal appelle cette nouvelle fonction et affiche le résultat. Le code suppose que l’API a renvoyé le format attendu : le traitement détaillé des réponses mal formées et des pannes sera étudié plus loin.
import requests
URL_API = "https://api.frankfurter.app/latest"
def obtenir_reponse_taux(source="EUR", cible="USD"):
"""Envoie une requête et retourne la réponse HTTP brute."""
reponse = requests.get(
URL_API,
params={"from": source, "to": cible},
timeout=5,
)
return reponse
def obtenir_taux(source="EUR", cible="USD"):
"""Vérifie la réponse et retourne le taux de la devise cible."""
reponse = obtenir_reponse_taux(source, cible)
reponse.raise_for_status()
donnees = reponse.json()
return float(donnees["rates"][cible])
if __name__ == "__main__":
taux = obtenir_taux()
print(f"1 EUR = {taux:.4f} USD")1 EUR = 1.08 USD
Le taux exact peut varier selon la date à laquelle vous exécutez la requête.L’appel à raise_for_status() précède le décodage : si le serveur répond par un statut HTTP d’erreur, l’exécution s’arrête à cette étape. Avec une réponse réussie, response.json() produit un dictionnaire dont la clé rates contient le taux demandé. La conversion avec float() fournit un nombre utilisable dans la suite du programme.
Exécuter le module
Depuis la racine du projet, lancez le module dans l’environnement virtuel du projet, comme vous l’avez fait pour le point d’entrée présenté dans la leçon sur les modules. La requête nécessite une connexion Internet ; le taux exact affiché dépend de la réponse de l’API au moment de l’exécution.
python -m depenses.change1 EUR = 1.0800 USDÀ retenir
- Vérifiez le statut HTTP avec raise_for_status() avant de traiter le corps.
- Décodez le JSON avec response.json() pour obtenir des objets Python.
- Récupérez le taux dans rates, avec la devise cible comme clé.
- Ne supposez pas qu’une réponse distante est toujours conforme : le traitement des pannes et la validation complète viendront ensuite.
Dans la prochaine leçon, vous traiterez les erreurs réseau et les réponses distantes inattendues afin de fournir un comportement contrôlé lorsque l’API ne répond pas comme prévu.