Gérer les réponses et les erreurs d’API
Analyse des réponses JSON, codes d’erreur et schémas de gestion des exceptions.
Gérer les réponses et les erreurs d’API est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.
L’objet de réponse
Chaque appel requests renvoie un objet de réponse. Il contient tout ce que le serveur a renvoyé : le code d’état, les en-têtes et le corps. Avant de traiter le corps, inspectez toujours le code d’état — une réponse avec un code 500 contient toujours un corps, mais celui-ci ne contiendra pas les données recherchées.
import requests
response = requests.get('https://api.example.com/data')
# Key attributes of the response
print(response.status_code) # e.g. 200
print(response.headers) # dict of response headers
print(response.headers.get('Content-Type')) # 'application/json'
print(response.text) # raw response body as string
print(response.content) # raw bytesAnalyser du JSON avec response.json()
Appelez response.json() pour analyser automatiquement le corps de la réponse en JSON et obtenir un dictionnaire ou une liste Python. Cela équivaut à json.loads(response.text), mais vérifie également que l’en-tête Content-Type est approprié.
N’appelez .json() que lorsque vous savez que la réponse est réellement au format JSON — vérifiez d’abord l’en-tête Content-Type.
import requests
response = requests.get(
'https://api.example.com/users/42',
headers={'Authorization': 'Bearer YOUR_KEY'}
)
# Parse JSON body
user = response.json()
# Access fields safely with .get()
name = user.get('name', 'Unknown')
email = user.get('email', '')
roles = user.get('roles', [])
print(f'User: {name} ({email})')
print(f'Roles: {roles}')Vérifier le code d’état avant l’analyse
N’appelez jamais response.json() sans avoir d’abord confirmé que la requête a abouti. Les réponses d’erreur (4xx/5xx) renvoient souvent des informations d’erreur au format JSON — utiles pour le débogage — mais ce ne sont pas les données dont vous avez besoin. Vérifiez toujours status_code en premier.
import requests
response = requests.post(
'https://api.example.com/tasks',
json={'title': 'Write report'},
headers={'Authorization': 'Bearer YOUR_KEY'}
)
if response.status_code == 201:
task = response.json()
print('Task created, ID:', task['id'])
elif response.status_code == 400:
error = response.json()
print('Validation error:', error.get('message'))
elif response.status_code == 401:
print('Auth failed — check your token')
else:
print(f'Unexpected status {response.status_code}: {response.text[:200]}')raise_for_status() — Lever automatiquement les erreurs
response.raise_for_status() lève automatiquement une exception HTTPError si le code d’état est 4xx ou 5xx. C’est une manière propre de transformer les mauvaises réponses HTTP en exceptions Python, ce qui vous permet d’utiliser try/except plutôt que de longues chaînes if/elif.
import requests
from requests.exceptions import HTTPError
try:
response = requests.get(
'https://api.example.com/users/9999',
headers={'Authorization': 'Bearer YOUR_KEY'}
)
response.raise_for_status() # raises if status >= 400
user = response.json()
print('Found user:', user['name'])
except HTTPError as e:
print(f'HTTP error: {e.response.status_code}')
print('Details:', e.response.text[:300])Gérer les erreurs de décodage JSON
Il arrive qu’une API renvoie une réponse qui n’est pas au format JSON alors que vous vous y attendez — une page d’erreur serveur en HTML, un corps vide ou un fichier binaire. Appeler response.json() dans ces situations déclenche json.JSONDecodeError. Interceptez toujours cette exception pour éviter les arrêts silencieux de l’agent.
import requests
import json
response = requests.get(
'https://api.example.com/report',
headers={'Authorization': 'Bearer YOUR_KEY'}
)
try:
data = response.json()
except json.JSONDecodeError as e:
print(f'Response is not valid JSON: {e}')
print('Content-Type:', response.headers.get('Content-Type'))
print('First 200 chars:', response.text[:200])
# Decide: is this an HTML error page? A CSV file?
data = None
if data is None:
print('Falling back to text processing')ConnectionError — Problèmes de réseau
Une ConnectionError se produit lorsque votre agent ne parvient pas du tout à joindre le serveur — échec de résolution DNS, serveur hors ligne ou pare-feu qui bloque la requête. Il s’agit d’une défaillance au niveau du réseau, avant même qu’une requête HTTP soit effectuée.
Contrairement à une erreur 5xx, ce n’est pas la réponse du serveur : la connexion n’a jamais eu lieu.
import requests
from requests.exceptions import ConnectionError
try:
response = requests.get('https://api.example.com/data')
data = response.json()
except ConnectionError as e:
print('Cannot reach server. Possible causes:')
print('- DNS failure (bad hostname)')
print('- Server is down')
print('- No internet connection')
print('- Firewall blocking the port')
print(f'Error detail: {e}')
# Consider: queue the request for retry when connectivity returnsDélai d’attente — Éviter que les agents restent bloqués
Par défaut, requests attend indéfiniment une réponse. Un serveur lent ou bloqué peut ainsi figer votre agent indéfiniment. Définissez toujours un délai d’attente : un tuple de (connect_timeout, read_timeout) en secondes. Une exception Timeout est levée si le serveur ne répond pas à temps.
import requests
from requests.exceptions import Timeout
try:
response = requests.get(
'https://api.example.com/slow-endpoint',
headers={'Authorization': 'Bearer YOUR_KEY'},
timeout=(5, 30) # 5s to connect, 30s to read
)
data = response.json()
except Timeout:
print('Request timed out after 30 seconds')
print('Options: retry, use cached result, or alert operator')Gestion complète des exceptions
Dans les agents en production, interceptez toutes les exceptions requests selon une hiérarchie cohérente. requests.exceptions.RequestException est la classe de base de toutes les erreurs de requests ; l’intercepter vous fournit un filet de sécurité contre les problèmes réseau inattendus.
import requests
import json
from requests.exceptions import (
ConnectionError, Timeout, HTTPError, RequestException
)
def safe_api_call(url, headers):
try:
r = requests.get(url, headers=headers, timeout=(5, 30))
r.raise_for_status()
return r.json()
except Timeout:
print('ERROR: Request timed out')
except ConnectionError:
print('ERROR: Cannot reach server')
except HTTPError as e:
print(f'ERROR: HTTP {e.response.status_code}')
try:
print('API error:', e.response.json().get('message'))
except json.JSONDecodeError:
print('Non-JSON error body')
except RequestException as e:
print(f'ERROR: Unexpected request error: {e}')
return NoneConsigner les réponses à des fins de débogage
Lorsqu’un agent se comporte de manière inattendue, vous avez besoin de suffisamment de contexte pour établir un diagnostic. Consignez la méthode de requête, l’URL, le code d’état et les détails pertinents de la réponse — mais ne consignez jamais les clés d’API. Utilisez le module logging intégré à Python plutôt que des instructions d’affichage pour les agents en production.
import logging
import requests
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('agent.api')
def logged_request(method, url, **kwargs):
logger.info(f'-> {method.upper()} {url}')
response = requests.request(method, url, **kwargs)
logger.info(
f'<- {response.status_code} '
f'({len(response.content)} bytes) '
f'{response.elapsed.total_seconds():.2f}s'
)
if response.status_code >= 400:
logger.error(f'Error body: {response.text[:500]}')
return responseGérer les réponses paginées
De nombreuses API renvoient les données par pages. Votre agent doit suivre les liens de pagination pour obtenir tous les résultats. Recherchez une URL next dans la réponse ou un champ page/cursor, puis bouclez jusqu’à ce qu’il n’y ait plus de pages.
import requests
def get_all_items(base_url, headers):
all_items = []
url = f'{base_url}/items?page=1&limit=100'
while url:
response = requests.get(url, headers=headers)
response.raise_for_status()
data = response.json()
all_items.extend(data.get('items', []))
# Follow 'next' link if present
url = data.get('next_page_url') # None stops the loop
print(f'Fetched {len(all_items)} items so far...')
print(f'Total: {len(all_items)} items')
return all_itemsDiffuser les réponses volumineuses
Pour les réponses volumineuses (fichiers, longues sorties d’IA), utilisez stream=True afin d’éviter de charger toute la réponse en mémoire en une seule fois. Lisez la réponse par morceaux. Cette approche est essentielle lorsque votre agent traite de grands ensembles de données ou diffuse du texte généré par l’IA.
import requests
response = requests.get(
'https://api.example.com/large-report',
headers={'Authorization': 'Bearer YOUR_KEY'},
stream=True
)
response.raise_for_status()
# Write streamed content to file
with open('report.json', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
print('Download complete')
# For streaming JSON lines (NDJSON):
for line in response.iter_lines():
if line:
import json
record = json.loads(line)
print(record)Vérification rapide : raise_for_status
Testez votre compréhension de la gestion des erreurs de réponse.
Récapitulatif de la gestion des réponses
Une gestion robuste des réponses distingue un agent fragile d’un agent fiable :
- Vérifiez toujours
status_codeavant d’analyser le corps - Utilisez
response.json()pour analyser le contenu, et interceptezJSONDecodeErrorsi le corps n’est peut-être pas au format JSON - Utilisez
raise_for_status()pour transformer les erreurs HTTP en exceptions - Interceptez
ConnectionErrorpour les défaillances réseau etTimeoutpour les serveurs lents - Définissez toujours un tuple
timeout=(connect, read)pour chaque requête - Consignez les requêtes et les réponses (sans les clés) pour faciliter le diagnostic
Questions Fréquemment Posées
La leçon « Gérer les réponses et les erreurs d’API » est-elle gratuite ?
Oui — le texte complet de « Gérer les réponses et les erreurs d’API » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Gérer les réponses et les erreurs d’API » ?
Analyse des réponses JSON, codes d’erreur et schémas de gestion des exceptions. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Agents ?
Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Gérer les réponses et les erreurs d’API » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?
Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Fondamentaux des API REST pour les développeurs d’agents
- Authentification : clés API et OAuth
- Gérer les réponses et les erreurs d’API
- Limitation du débit et logique de nouvelle tentative