API-Responses und Fehler verarbeiten
JSON-Responses parsen, Fehlercodes behandeln und Muster für Exception Handling einsetzen.
API-Responses und Fehler verarbeiten ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Das Response-Objekt
Jeder requests-Aufruf gibt ein Response-Objekt zurück. Es enthält alles, was der Server zurückgesendet hat: den Statuscode, die Header und den Body. Prüfen Sie immer den Statuscode, bevor Sie den Body verarbeiten – eine Antwort mit dem Status 500 enthält zwar weiterhin einen Body, aber nicht die von Ihnen benötigten Daten.
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 bytesJSON mit response.json() parsen
Rufen Sie response.json() auf, um den Antwort-Body automatisch als JSON in ein Python-Dict oder eine Python-Liste zu parsen. Dies entspricht json.loads(response.text), prüft aber zusätzlich, ob der Content-Type geeignet ist.
Rufen Sie .json() nur auf, wenn Sie wissen, dass die Antwort tatsächlich JSON enthält – prüfen Sie zuerst den Content-Type-Header.
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}')status_code vor dem Parsen prüfen
Rufen Sie niemals response.json() auf, ohne zuvor zu bestätigen, dass die Anfrage erfolgreich war. Fehlerantworten (4xx/5xx) enthalten häufig JSON-Fehlerdetails, die für die Fehlersuche nützlich sind – aber nicht die von Ihnen benötigten Daten. Prüfen Sie immer zuerst status_code.
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() – Fehler automatisch auslösen
response.raise_for_status() löst automatisch eine HTTPError-Ausnahme aus, wenn der Statuscode 4xx oder 5xx lautet. Auf diese Weise lassen sich fehlerhafte HTTP-Antworten sauber in Python-Ausnahmen umwandeln, sodass Sie try/except statt langer if/elif-Ketten verwenden können.
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])JSONDecodeError behandeln
Manchmal gibt eine API eine Antwort zurück, die nicht JSON ist, obwohl Sie JSON erwarten – etwa eine HTML-Fehlerseite des Servers, einen leeren Body oder eine Binärdatei. Der Aufruf von response.json() für solche Antworten löst json.JSONDecodeError aus. Fangen Sie diese Ausnahme immer ab, damit Ihr Agent nicht unbemerkt abstürzt.
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 – Netzwerkprobleme
Ein ConnectionError tritt auf, wenn Ihr Agent den Server überhaupt nicht erreichen kann – etwa wegen eines Fehlers bei der DNS-Auflösung, eines Offline-Servers oder einer Firewall, die die Anfrage blockiert. Dabei handelt es sich um einen Fehler auf Netzwerkebene, der auftritt, bevor überhaupt eine HTTP-Kommunikation stattfindet.
Anders als bei einem 5xx-Fehler handelt es sich hierbei nicht um eine Antwort des Servers – die Verbindung wurde gar nicht hergestellt.
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 returnsTimeout – Feststeckende Agenten verhindern
Standardmäßig wartet requests unbegrenzt auf eine Antwort. Ein langsamer oder nicht reagierender Server kann Ihren Agenten daher auf unbestimmte Zeit blockieren. Setzen Sie immer ein Timeout: ein Tupel aus (connect_timeout, read_timeout) in Sekunden. Wenn der Server nicht rechtzeitig antwortet, wird eine Timeout-Ausnahme ausgelöst.
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')Umfassende Ausnahmebehandlung
Fangen Sie in Produktionsagenten alle requests-Ausnahmen in einer einheitlichen Hierarchie ab. requests.exceptions.RequestException ist die Basisklasse für alle requests-Fehler. Wenn Sie sie abfangen, erhalten Sie ein Sicherheitsnetz für unerwartete Netzwerkprobleme.
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 NoneAntworten zur Fehlersuche protokollieren
Wenn sich ein Agent unerwartet verhält, benötigen Sie genügend Kontext, um die Ursache zu ermitteln. Protokollieren Sie die Anfragemethode, die URL, den Statuscode und relevante Details der Antwort – aber protokollieren Sie niemals API-Schlüssel. Verwenden Sie für Produktionsagenten das integrierte Python-Modul logging statt print-Anweisungen.
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 responsePaginierte Antworten verarbeiten
Viele APIs geben Daten seitenweise zurück. Ihr Agent muss den Paginierungslinks folgen, um alle Ergebnisse abzurufen. Suchen Sie in der Antwort nach einer next-URL oder einem page- bzw. cursor-Feld und wiederholen Sie den Vorgang, bis keine weiteren Seiten vorhanden sind.
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_itemsGroße Antworten streamen
Verwenden Sie für große Antworten (Dateien, lange KI-Ausgaben) stream=True, damit nicht die gesamte Antwort auf einmal in den Arbeitsspeicher geladen wird. Lesen Sie die Antwort in Blöcken. Das ist unverzichtbar, wenn Ihr Agent große Datensätze verarbeitet oder von KI generierten Text streamt.
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)Kurztest: raise_for_status
Testen Sie Ihr Verständnis der Fehlerbehandlung von Antworten.
Zusammenfassung: Antwortverarbeitung
Eine robuste Antwortverarbeitung unterscheidet einen fragilen Agenten von einem zuverlässigen:
- Prüfen Sie immer
status_code, bevor Sie den Body parsen. - Verwenden Sie
response.json()zum Parsen und fangen SieJSONDecodeErrorab, wenn der Body möglicherweise kein JSON enthält. - Verwenden Sie
raise_for_status(), um HTTP-Fehler in Ausnahmen umzuwandeln. - Fangen Sie
ConnectionErrorbei Netzwerkfehlern undTimeoutbei langsamen Servern ab. - Setzen Sie bei jeder Anfrage immer ein
timeout=(connect, read)-Tupel. - Protokollieren Sie Anfragen und Antworten (ohne Schlüssel), damit sich Probleme leichter untersuchen lassen.
Häufig gestellte Fragen
Ist die Lektion „API-Responses und Fehler verarbeiten“ kostenlos?
Ja — der vollständige Text von „API-Responses und Fehler verarbeiten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „API-Responses und Fehler verarbeiten“?
JSON-Responses parsen, Fehlercodes behandeln und Muster für Exception Handling einsetzen. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „API-Responses und Fehler verarbeiten“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- REST-API-Grundlagen für Agentenentwickler
- Authentifizierung: API-Keys und OAuth
- API-Responses und Fehler verarbeiten
- Rate Limiting und Retry-Logik