DE EN

APIs & Requests

Mit dem Internet kommunizieren — Wetterdaten abrufen, APIs verstehen, echte Daten nutzen.

60 Min Schwer

Lernziele dieses Kapitels

  • Du sendest HTTP-Requests mit der requests-Bibliothek
  • Du verarbeitest JSON-Antworten von APIs
  • Du nutzt API-Keys sicher über Umgebungsvariablen
  • Du erweiterst PyBuddy um eine Wetter-Funktion

HTTP-Requests mit requests

Mit der requests-Bibliothek holst du Daten aus dem Internet. requests.get(url) ruft eine Webseite oder API ab. Der status_code zeigt, ob alles funktioniert hat.

  • 200 — Alles OK
  • 404 — Nicht gefunden
  • 500 — Server-Fehler
Python
import requests

# Einfacher GET-Request
url = "https://api.github.com"
response = requests.get(url)

print(f"Status: {response.status_code}")
print(f"Content-Type: {response.headers['Content-Type']}")

# JSON-Antwort verarbeiten
if response.status_code == 200:
    daten = response.json()
    print(f"API: {daten['current_user_url']}")
else:
    print(" Fehler beim Abrufen")
Ausgabe
Status: 200 Content-Type: application/json API: https://api.github.com/user
Python vs. JavaScript — Das kennst du schon!

Du kennst bereits JavaScript aus dem JS-Quest. Hier ist der direkte Vergleich:

Python
import requests
r = requests.get(url)
daten = r.json()
JavaScript
fetch(url)
  .then(r => r.json())
  .then(daten => console.log(daten));
Merke: Python: requests.get() ist synchron und einfach. JavaScript: fetch() ist asynchron und gibt Promises zurück. Beides holt Daten vom Server.

JSON-Antworten verarbeiten

Die meisten modernen APIs liefern JSON. Mit response.json() wandelt Python die Antwort direkt in ein Dictionary um — dann kannst du wie gewohnt auf die Daten zugreifen.

Python
import requests

# Öffentliche API: Zufälliger Nutzer
url = "https://randomuser.me/api/"
response = requests.get(url)

if response.status_code == 200:
    daten = response.json()
    user = daten["results"][0]
    
    name = user["name"]["first"] + " " + user["name"]["last"]
    email = user["email"]
    land = user["location"]["country"]
    
    print(f"👤 Name: {name}")
    print(f"📧 E-Mail: {email}")
    print(f" Land: {land}")
else:
    print(f" Fehler: {response.status_code}")
Ausgabe
👤 Name: John Doe 📧 E-Mail: john.doe@example.com Land: Germany
Python vs. JavaScript — Das kennst du schon!

Du kennst bereits JavaScript aus dem JS-Quest. Hier ist der direkte Vergleich:

Python
daten = response.json()
user = daten['results'][0]
print(user['name']['first'])
JavaScript
const daten = await response.json();
const user = daten.results[0];
console.log(user.name.first);
Merke: Der Zugriff auf verschachtelte JSON-Daten ist in Python und JavaScript fast identisch — nur die Syntax für Schlüssel unterscheidet sich leicht.

API-Keys sicher nutzen

Viele APIs benötigen einen API-Key — ein Passwort für den API-Zugriff. Niemals Keys direkt im Code speichern! Nutze stattdessen Umgebungsvariablen.

Sicherheitswarnung

Wenn du API-Keys in GitHub committest, können sie von Bots ausgelesen und missbraucht werden. Nutze immer os.getenv()!

Python
import os

# API-Key aus Umgebungsvariable holen
api_key = os.getenv("OPENWEATHER_API_KEY")

if not api_key:
    print("  Kein API-Key gefunden! Setze die Umgebungsvariable:")
    print("   export OPENWEATHER_API_KEY=dein_key")
else:
    print(" API-Key geladen.")
    # Sicher verwenden
    url = f"https://api.openweathermap.org/data/2.5/weather?q=Wien&appid={api_key}"
    # ... Request senden
Ausgabe
Kein API-Key gefunden! Setze die Umgebungsvariable: export OPENWEATHER_API_KEY=dein_key

Fehlerbehandlung bei APIs

Netzwerk-Anfragen können aus vielen Gründen fehlschlagen: Kein Internet, Server überlastet, falsche URL. Gute Fehlerbehandlung macht dein Programm robust.

Python
import requests

def hole_daten(url):
    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()  # Löst Exception bei 4xx/5xx aus
        return response.json()
    except requests.exceptions.Timeout:
        print("  Zeitüberschreitung — Server antwortet nicht.")
    except requests.exceptions.ConnectionError:
        print(" Keine Internetverbindung.")
    except requests.exceptions.HTTPError as e:
        print(f" HTTP-Fehler: {e}")
    except requests.exceptions.RequestException:
        print(" Unbekannter Netzwerkfehler.")
    return None

# Test
daten = hole_daten("https://httpbin.org/status/404")
if daten:
    print("Daten erfolgreich geladen.")
Ausgabe
HTTP-Fehler: 404 Client Error: NOT FOUND for url: ...

APIs in Aktion: Wetter abrufen

Jetzt kommt alles zusammen: Wir rufen echte Wetterdaten ab — ohne API-Key, dank der öffentlichen wttr.in-API.

Python
import requests

def wetter_abrufen(stadt):
    url = f"https://wttr.in/{stadt}?format=%C+%t&lang=de"
    try:
        response = requests.get(url, timeout=5)
        if response.status_code == 200:
            return response.text.strip()
        return " Stadt nicht gefunden"
    except requests.exceptions.RequestException:
        return " Netzwerkfehler"

# Nutzung
stadt = input(" Für welche Stadt willst du das Wetter wissen? ")
wetter = wetter_abrufen(stadt)
print(f"\n🌤️  Wetter in {stadt}: {wetter}")
Ausgabe
Für welche Stadt willst du das Wetter wissen? Wien 🌤️ Wetter in Wien: Partly cloudy +18°C

Warm-Up: Bitcoin-Preis abrufen

Nutze die CoinDesk API, um den aktuellen Bitcoin-Preis in Euro abzurufen und anzuzeigen.

Hinweis: import requests url = 'https://api.coindesk.com/v1/bpi/currentprice.json' try: r = requests.get(url, timeout=5) daten = r.json() preis = daten['bpi']['EUR']['rate'] print(f'💰 Bitcoin-Preis: {preis} €') except Exception as e: print(f' Fehler: {e}')

Lösung
import requests

url = 'https://api.coindesk.com/v1/bpi/currentprice.json'
try:
    r = requests.get(url, timeout=5)
    daten = r.json()
    preis = daten['bpi']['EUR']['rate']
    print(f'💰 Bitcoin-Preis: {preis} €')
except Exception as e:
    print(f' Fehler: {e}')

Challenge: GitHub Profil-Info

Erstelle ein Programm, das öffentliche GitHub-Profil-Informationen abruft. Der Nutzer gibt einen Benutzernamen ein, das Programm zeigt Follower und öffentliche Repos an.

Hinweis: import requests user = input('GitHub Username: ') url = f'https://api.github.com/users/{user}' try: r = requests.get(url, timeout=5) if r.status_code == 200: d = r.json() print(f"👤 {d['name'] or d['login']}") print(f" Öffentliche Repos: {d['public_repos']}") print(f"👥 Follower: {d['followers']}") else: print(' Benutzer nicht gefunden') except requests.exceptions.RequestException: print(' Netzwerkfehler')

Lösung
import requests

user = input('GitHub Username: ')
url = f'https://api.github.com/users/{user}'
try:
    r = requests.get(url, timeout=5)
    if r.status_code == 200:
        d = r.json()
        print(f"👤 {d['name'] or d['login']}")
        print(f" Öffentliche Repos: {d['public_repos']}")
        print(f"👥 Follower: {d['followers']}")
    else:
        print(' Benutzer nicht gefunden')
except requests.exceptions.RequestException:
    print(' Netzwerkfehler')

PyBuddy-Checkpoint: Wetter-Funktion

PyBuddy bekommt eine wetter()-Funktion, die das aktuelle Wetter für eine Stadt abruft und anzeigt.

Hinweis: # pybuddy/main.py import requests def wetter(stadt): url = f'https://wttr.in/{stadt}?format=%C+%t&lang=de' try: r = requests.get(url, timeout=5) return r.text.strip() if r.status_code == 200 else 'Nicht gefunden' except: return 'Netzwerkfehler' stadt = input(' Stadt: ') print(f'🌤️ {wetter(stadt)}')

Lösung
# pybuddy/main.py
import requests

def wetter(stadt):
    url = f'https://wttr.in/{stadt}?format=%C+%t&lang=de'
    try:
        r = requests.get(url, timeout=5)
        return r.text.strip() if r.status_code == 200 else 'Nicht gefunden'
    except:
        return 'Netzwerkfehler'

stadt = input(' Stadt: ')
print(f'🌤️  {wetter(stadt)}')
Didaktische Pause

In Fortnite ruft das Spiel ständig APIs ab: Wetterdaten für Events, Shop-Inhalte, Matchmaking-Informationen. Jeder Skin-Kauf, jede Freundschaftsanfrage, jeder Sieg — alles geht über HTTP-Requests an Epic's Server. Du baust gerade die gleiche Technologie!

Zusammenfassung

  • requests.get() → Daten von APIs abrufen
  • response.json() → JSON in Dictionary umwandeln
  • API-Keys immer in Umgebungsvariablen speichern
  • try/except für robuste Netzwerk-Anfragen
  • Echte APIs machen deine Programme lebendig