Eine REST-API (API: Application Programming Interface) ist eine Programmierschnittstelle bzw. Web-API für Webservices. Sie wird auch in der Netzwerkautomatisierung verwendet, um das Netzwerk zu überwachen und zu konfigurieren.
In diesem Artikel lernst Du die Grundprinzipien der REST-API, der JSON-Notation und der Programmierung einer REST-API in Python kennen und anwenden.
Um eine REST-API zu verstehen, hilft der Vergleich mit einem Restaurant-Besuch:
Wie ein Gast nicht selbst am Herd stehen sollte, schützt die API den Server. Sie stellt sicher, dass nur "Bestellungen" (Anfragen) bearbeitet werden, die auf der Speisekarte (Dokumentation) stehen.
Im Wesentlichen gibt es in einem Bestellprozess vier Schritte:
REST (Representational State Transfer) ist das Regelwerk für diesen Kellner. Es nutzt die Standardprotokoll des Internets: HTTP.
Jede Information (Datensatz) im Netzwerk bekommt eine eindeutige Adresse (URL). Die Kommunikation ist dabei stateless, das heißt, jede Bestellung muss für sich komplett verständlich sein.
Im Rahmen von REST wird zum Datenaustausch meistens das Datenformat JSON (JavaScript Object Notation). Aber es sind auch andere Formate wie XML und HTML möglich.
| Aktion & Methode | Beschreibung |
|---|---|
|
Abfragen GET |
Liest einen oder mehrere Datensätze vom Server aus (z. B. beim Anzeigen von Daten). |
|
Erzeugen POST |
Erzeugt einen neuen Datensatz auf dem Server (z. B. über ein Kontaktformular). |
|
Aktualisieren PUT |
Aktualisiert einen vorhandenen Datensatz auf dem Server durch vollständiges Ersetzen. |
| Löschen DELETE | Löscht einen Datensatz dauerhaft vom Server. |
Ein REST-Aufruf besteht immer aus einem Request (Anfrage des Clients) und einer Response (Antwort des Servers).
GET, POST, etc.)/users/1)Content-Type: application/json oder Zugangsdaten).200 OK, 404 Not Found).In Python kann man mit der requests-Bibliothek eine REST-API anzusprechen.
import requests
# 1. Daten lesen (GET-Request)
url = "https://jsonplaceholder.typicode.com/posts/2"
data = requests.get(url)
print("GET Ergebnis:", data.json())
# 2. Daten senden (POST-Request)
url = "https://jsonplaceholder.typicode.com/posts"
neuerDatensatz = {"title": "Mein Beitrag", "body": "Inhalt", "userId": 1}
response = requests.post(url, json=neuerDatensatz)
print("POST Status-Code:", response.status_code) # Erwartet: 201 (Created)
print("POST Ergebnis:", response.json())
https://jsonplaceholder.typicode.com ist eine kostenlose, zuverlässige Fake-API für Tests und Prototyping. Beim Ansprechen liefert sie Daten im JSON-Format zurück und auch das Senden von Daten ist möglich.
Man beachte, dass beim Aufruf der POST-Methode die JSON-Daten mit übergeben werden müssen. Der Status einer Response kann über .status_code abgefragt werden.
JSON-Daten werden in Python als Dictionaries verarbeitet. Dictionaries haben wie JSON-Daten Schlüssel-Wert-Paare. Sie verwenden allerdings pythonspezifische Datentypen wie True, False (großgeschrieben) oder None. Die Schlüssel müssen nicht unbedingt Strings sein; es könnten auch Zahlen oder Tupel sein und man kann Methoden auf sie anwenden.
Ausgangspunkt für alle folgenden Erläuterungen sind die folgende verschachtelte JSON-Daten:
standort = {
"TT": {"enabled": True, "router": 2, "switch": 6},
"FN": {"enabled": True, "router": 4, "switch": 4},
"RV": {"enabled": False, "router": 1, "switch": 8}
}
| Methode & Beschreibung | Syntax & Beispiel-Ausgabe |
|---|---|
|
Direkter Zugriff Zugriff auf den gesamten Datensatz eines Keys. |
print(standort["TT"])
{"enabled": True, "router": 2, ...}
|
|
Verschachtelt Einzelwert aus der tieferen Ebene lesen. |
print(standort["FN"]["enabled"])
True
|
|
Iteration über die Schlüssel Schleife über alle Standorte (Schlüssel). |
for key in ports:
"TT"
"FN" "RV" |
Iteration über die Werte – .values()Innere Daten ohne Namen durchlaufen. |
for val in ports.values():
{"enabled": True, "router": 2, ...}
{"enabled": True, "router": 4, ...} |
Iteration über Schlüssel und Werte – .items()Kombinierter Zugriff auf Schlüssel und Wert. |
for key, val in ports.items():
TT {"enabled": True, ...}
FN {"enabled": True, ...} |
Abfrage von Status-Werten eines Netzwerkgeräts in Echtzeit über seine REST-Schnittstelle.
Das Gerät meldet sich von selbst, wenn ein Fehler auftritt (Event-Driven).
Skripte können hunderte Geräte gleichzeitig konfigurieren, ohne CLI-Eingaben.
Die API unter https://jsonplaceholder.typicode.com gibt Daten eines Benutzers zurück. Das Ergebnis sieht gekürzt so aus:
user = {
"id": 1,
"name": "Leanne Graham",
"address": {
"street": "Kulas Light",
"city": "Gwenborough",
"geo": { "lat": "-37.3159", "lng": "81.1496" }
}
}
GET.name des Benutzers aus.city aus.lng des Benutzers zu.Die API unter https://jsonplaceholder.typicode.com/users gibt eine Liste mit Benutzerdaten zurück.
GET..items(), um alle Schlüssel und Werte eines Users auszugeben.Die API unter https://jsonplaceholder.typicode.com/posts gibt eine Liste aus Posts zurück. Das Ergebnis sieht bspw. so aus:
{
"userId": 10,
"id": 97,
"title": "quas fugiat ut perspiciatis vero provident",
"body": "eum non blanditiis soluta porro quibusdam ..."
}
Der gleiche Endpunkt bietet die Möglichkeit mittels POST-Methode Einträge hinzuzufügen.
GET.id aus.id == 7, ersetzte den Eintrag durch einen neuen Eintrag.Du arbeitest als Entwickler/Entwicklerin in einem Projektteam der Brauerei Meckatzer in Heimenkirch aus dem Allgäu.
Um Ausfälle in der Bierproduktion frühzeitig zu erkennen, werden die Access-Switches automatisiert überwacht. Ein Python-Modul fragt per REST-API den Port-Status ab.
Das Modul liefert die Daten als Python-Dictionary (Basis für JSON-Austausch). Dabei bedeuten:
Vorhandener Basis-Code:
ports = {
"g0/1": {"enabled": True, "link": False, "speed": ""},
"g0/2": {"enabled": True, "link": True, "speed": "1G"},
"g0/3": {"enabled": True, "link": True, "speed": "100M"},
"g0/4": {"enabled": False, "link": True, "speed": "10M"}
}
4.1 In dem Programm wird eine Rest-Schnittstelle in Verbindung mit JSON verwendet.
4.1.1 Benenne die Vorteile einer REST-API gegenüber klassischen Abfrage-Methoden.
Wähle zwei Antworten.
4.1.2 Welche Eigenschaften charakterisieren das JSON-Format in Verbindung mit REST?
Wähle zwei Antworten.
4.1.3 Unterscheide die HTTP-Methoden GET und POST im Kontext einer REST-API.
Wähle zwei korrekte Aussagen.
4.1.4 In einer JSON-Antwort werden verschiedene Datentypen verwendet. Welche Aussagen zur Struktur sind korrekt?
Wähle zwei Antworten.
[ ] kennzeichnen eine Liste (Array).{ } umschließen ein Objekt (Dictionary).4.2 JSON-Daten werden in Python als Dictionaries (Schlüssel-Wert-Paare) verarbeitet:
4.2.1 Du möchtest prüfen, ob der Port "g0/4" administrativ aktiviert ist. Welcher Python-Ausdruck liefert diesen Wert?
Wähle eine Antwort.
ports["enabled"]["g0/4"]ports["g0/4"]["enabled"]ports["enabled"]ports.g0/4.enabled4.2.2 Was passiert, wenn du die Schleife for x in ports: ausführst?
Wähle zwei korrekte Aussagen.
x nimmt die Werte "g0/1", "g0/2" etc. an.x enthält das gesamte innere Dictionary (die Details).ports[x] greift man auf die Port-Details zu.4.2.3 Du möchtest die Geschwindigkeit (speed) des Ports "g0/3" auslesen. Welcher Python-Befehl ist dafür korrekt?
Wähle eine Antwort.
ports["g0/3"].speedports["g0/3"]["speed"]ports.get("speed")["g0/3"]ports["speed"]["g0/3"]4.2.4 Du führst for k, v in ports.items(): aus. Welche Aussage beschreibt die Variablen korrekt?
Wähle eine Antwort.
k ist ein Zähler (0, 1, ...), v ist der Port-Name.k ist der Port-Name, v ist das Dictionary mit den Details.k enthält "link", v enthält "speed".4.3 Entwickle die Funktionen isAnyLinkDown(ports), die True als Rückgabewert liefert, wenn mindestens ein Link im als ports übergebenen Dictionary down ist.
4.4 Entwickle die Funktionen numSlowPorts(ports), welche die Anzahl der Ports als Rückgabewert liefert, die mit 100M oder 10M Geschwindigkeit laufen.
| REST | Representational State Transfer: Architekturstil für die Kommunikation in Netzwerken, der auf Standards wie HTTP setzt. |
| API | Application Programming Interface: Die Schnittstelle, über die zwei Anwendungen miteinander kommunizieren. |
| stateless | Jede Anfrage wird isoliert kontrolliert: Der Server speichert keinen Sitzungsstatus (keine Sessions). Jede Anfrage muss alle Informationen enthalten, die für die Bearbeitung nötig sind. |
| Status-Codes | Ein wichtiger Teil von REST: 200 OK: Alles hat geklappt, 201 Created: Ein Datensatz wurde erfolgreich erstellt (nach POST) und 404 Not Found: Der Datensatz wurde nicht gefunden. |
| GET-Request | Lesen von Daten: Gilt als "sicher", da die Daten auf dem Server dabei nicht verändert werden. |
| POST-Request | Schreiben von Daten: Zum Erzeugen eines neuen Datensatzes wird die ID meist vom Server vergeben. |
| PUT-Request | Ändern von Daten: Zum vollständigen Ersetzen eines Datensatzes. Wenn nur Teile geändert werden sollen, nutzt man PATCH. |
| DELETE-Request | Löschen von Daten: Löscht den spezifizierten Datensatz permanent. |
| JSON-Daten | JavaScript Object Notation: ist ein textbasiertes Format, strukturiert durch Schlüssel und Werte. Es ist leicht lesbar und verarbeitbar. |