Kapitel 22 • Data Engineering • Web & REST APIs

Web-APIs, REST & JSON-Feeds 🌐📡

Lerne, wie Web-APIs funktionieren, wie du strukturierte JSON-Feeds in Python parst, Daten filterst und Netzwerk- sowie Parsing-Fehler professionell abfängst.

📂 Dateien dieser Einheit:
💻 In Web-IDE öffnen → 📄 aufgabe.py (Startercode) 🧪 test_aufgabe.py (Tests) 💡 musterloesung.py (Lösung) 📖 README.md

1. Was ist eine REST-API? (Die Kellner-Analogie)

Eine API (Application Programming Interface) ist eine Schnittstelle, über die zwei Computer oder Programme übers Internet miteinander kommunizieren. Nahezu jede moderne Web-App (wie Wetterberichte, Börsenkurse, Spotify oder Google Maps) stellt ihre Daten über REST-APIs im JSON-Format bereit.

🍽️ Die Restaurant-Analogie:
Stell dir den Ablauf in einem Restaurant vor:
  • Der Gast (Client / Dein Python-Skript): Du sitzt am Tisch und möchtest ein bestimmtes Gericht (Daten) bestellen.
  • Die Speisekarte (API-Dokumentation / Endpunkte): Zeigt dir, welche Gerichte (URLs & Parameter wie /weather?city=Wien) du bestellen kannst.
  • Der Kellner (Die REST-API): Nimmt deine Bestellung (**HTTP Request**) entgegen, eilt in die Küche und bringt dir das fertige Essen (**HTTP Response**) zurück.
  • Die Küche & Vorratskammer (Web-Server & Datenbank): Verarbeitet die Rohzutaten und bereitet das Essen zu.

Der typische Ablauf eines API-Aufrufs

[Client: Python-App]
│  🚀 1. HTTP GET Request (z.B. https://api.wetter.com/v1/forecast?city=Berlin)
▼
[Server: Wetter-Datenbank]
│  📦 2. HTTP Response 200 OK + JSON-Payload: {"temp": 21.5, "city": "Berlin"}
▼
[Client: json.loads(payload)] ➔ Extrahiert Dicts, Listen und bereitet Anzeige auf

2. Die wichtigsten HTTP-Statuscodes

Jede API-Antwort enthält einen 3-stelligen numerischen Statuscode, der signalisiert, ob die Anfrage geklappt hat:

Code Bedeutung Typischer Grund
200 OK Erfolg Die Daten wurden erfolgreich gefunden und als JSON zurückgegeben.
400 Bad Request Ungültige Anfrage Falsche Parameter übergeben (z.B. ungültiges Datumsformat).
404 Not Found Nicht gefunden Stadt, Benutzer oder URL-Endpunkt existiert nicht.
500 Internal Server Error Serverfehler Unerwarteter Fehler oder Absturz auf dem Zielserver.

3. JSON-Parsing & Defensive Fehlerbehandlung

Im Web empfangen wir Daten fast immer als rohen Textstring. Mit json.loads() (load string) parsen wir ihn in Python:

Sicheres Parsen verschachtelter JSON-Antworten
import json

roher_json_text = '''
{
    "name": "Hamburg",
    "main": {"temp": 17.5, "humidity": 82},
    "weather": [{"description": "Leichter Nieselregen"}]
}
'''

try:
    daten = json.loads(roher_json_text)
    
    # Defensiver Zugriff auf verschachtelte Werte:
    stadt = daten["name"]
    temperatur = float(daten["main"]["temp"])
    beschreibung = daten["weather"][0]["description"]
    
except json.JSONDecodeError as e:
    print(f"Kaputter JSON-String: {e}")
except (KeyError, IndexError) as e:
    print(f"Unerwartete Datenstruktur / Fehlendes Feld: {e}")

4. 🎯 Deine Aufgaben in aufgabe.py

Öffne die Datei aufgabe.py und vervollständige die Web-API-Tools:

💡 Lösungshinweise (Aufklappen bei Bedarf)

🔍 Tipp zu parse_wetter_antwort
try:
    data = json.loads(json_text)
    return {
        "stadt": data["name"],
        "temperatur": float(data["main"]["temp"]),
        "luftfeuchtigkeit": int(data["main"]["humidity"]),
        "wetterlage": data["weather"][0]["description"]
    }
except Exception as e:
    raise ValueError(f"Ungültige Wetterdaten: {e}")
🔍 Tipp zum Ticker-String
items = [f"[{n['ressort']}] {n['titel']}" for n in nachrichten]
return " +++ ".join(items) + " +++"

5. 🧪 Lösung überprüfen

Führe im Terminal im Ordner 22_web_apis_und_json_feeds folgenden Befehl aus:

Terminal
python3 test_aufgabe.py

🧠 Diagnostischer Selbst-Check

Überprüfe dein Verständnis der Kernkonzepte und typischen Denkfallen, bevor du den Code in der Web-IDE schreibst.