REST-Methoden

REST-API und Netz­werk­automatisierung

Autoren: G. Kompa, T. Rauschmaier, D. Supper

Eine REST-API (API: Application Programming Interface) ist eine Programmier­schnittstelle 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.

1 Das REST-Prinzip: Der digitale Kellner

Um eine REST-API zu verstehen, hilft der Vergleich mit einem Restaurant-Besuch:

  • Der Gast (Client): Das ist dein Python-Programm. Du möchtest Daten (Essen), hast aber keinen direkten Zugriff auf die Küche.
  • Die Küche (Server): Hier liegen die Daten oder die Datenbank. Dort wird die Arbeit erledigt.
  • Der Kellner (API): Er nimmt deine Bestellung entgegen, bringt sie in die Küche und serviert dir das Ergebnis (die Antwort).
Warum dieser Umweg?

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:

  1. "Ich hätte gern die Speisekarte." (Daten abrufen)
  2. "Ich möchte ein neues Gericht bestellen." (Daten senden)
  3. "Ich möchte meine Bestellung korrigieren." (Daten updaten)
  4. "Storniere meine Bestellung bitte." (Daten löschen)

2 Was bedeutet REST technisch?

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.

📄
Datenformat: JSON

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.

3 Die REST-Methoden

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.
Hinweis zu PUT: Ergänzend wird PATCH genutzt, um nur Teile eines Datensatzes zu ändern, statt den gesamten Satz zu ersetzen.

Aufbau der HTTP Kommunikation

Ein REST-Aufruf besteht immer aus einem Request (Anfrage des Clients) und einer Response (Antwort des Servers).

HTTP REQUEST (Client → Server)
  • 1. Methode: Was soll getan werden? (GET, POST, etc.)
  • 2. Endpoint (URL): Welcher Datensatz ist betroffen? (z.B. /users/1)
  • 3. Header: Metadaten zur Anfrage (z.B. Content-Type: application/json oder Zugangsdaten).
  • 4. Body (Payload): Die eigentlichen Daten im JSON-Format (nur bei POST, PUT, PATCH).
HTTP RESPONSE (Server → Client)
  • 1. Status-Code: War die Anfrage erfolgreich? (z.B. 200 OK, 404 Not Found).
  • 2. Header: Infos vom Server (z.B. Servertyp, Ablaufdatum der Daten).
  • 3. Body: Die angeforderten Daten (meist als JSON) oder eine Fehlermeldung.
Wichtige Status-Codes: 2xx Erfolg | 3xx Umleitung | 4xx Client-Fehler (z.B. Tippfehler in URL) | 5xx Server-Fehler

5 Integration in Python

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.

6 JSON in Python

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:
    print(key)
"TT"
"FN"
"RV"
Iteration über die Werte – .values()
Innere Daten ohne Namen durchlaufen.
for val in ports.values():
    print(val)
{"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():
    print(key, val)
TT {"enabled": True, ...}
FN {"enabled": True, ...}

7 Einsatz in der Netzwerktechnik

Live-Monitoring

Abfrage von Status-Werten eines Netzwerkgeräts in Echtzeit über seine REST-Schnittstelle.

Webhook

Das Gerät meldet sich von selbst, wenn ein Fehler auftritt (Event-Driven).

Automatisierung

Skripte können hunderte Geräte gleichzeitig konfigurieren, ohne CLI-Eingaben.

Arbeitsauftrag 1 - JSON-Training

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" }
    }
}
  1. Lade den Benutzerd­datensatz via GET.
  2. Gib den name des Benutzers aus.
  3. Gib die Stadt city aus.
  4. Greife auf den Längengrad lng des Benutzers zu.

Arbeitsauftrag 2 - Iteration und Filterung

Die API unter https://jsonplaceholder.typicode.com/users gibt eine Liste mit Benutzerdaten zurück.

  1. Lade alle User herunter GET.
  2. Erstelle eine Schleife die alle Benutzer durchläuft.
  3. Nutze innerhalb der Schleife .items(), um alle Schlüssel und Werte eines Users auszugeben.
  4. Filter: Gib alle User aus, deren Email auf code class="prettyprint">.net endet.

Arbeitsauftrag 3 - POST-Request

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.

  1. Lade den Datensatz via GET.
  2. Iteriere über alle Posts und gib die id aus.
  3. Füge einen neuen Eintrag hinzu.
  4. Löche einen Eintrag
  5. Bedingung: Falls id == 7, ersetzte den Eintrag durch einen neuen Eintrag.
  6. Gib für jeden erfolgreichen POST den Status-Code aus.

Arbeitsauftrag 4 - Netzwerk-Monitoring via REST-API

Situationsbeschreibung

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:

  • "eanbled": Port von Administrator ist aktiviert (True) oder deaktiviert (False),
  • "link": Ethernet-Link ist up (True) oder down (False)
  • "speed": Ethernet-Geschwindigkeit ("1G", "1OOM", "1OM", bei fehlendem Link: leerer String)

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"}
}
Auftragsbearbeitung

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.

  1. REST ist zustandslos (stateless) und dadurch gut skalierbar
  2. REST benötigt zwingend eine dauerhafte SSH-Verbindung
  3. REST nutzt Standard-HTTP-Methoden (GET, POST, etc.)
  4. REST kann nur mit binären Datenformaten kommunizieren


4.1.2 Welche Eigenschaften charakterisieren das JSON-Format in Verbindung mit REST?
Wähle zwei Antworten.

  1. JSON ist textbasiert und für Menschen leicht lesbar
  2. JSON benötigt mehr Speicherplatz als XML
  3. JSON lässt sich direkt in Python-Dictionaries umwandeln
  4. JSON unterstützt keine verschachtelten Datenstrukturen


4.1.3 Unterscheide die HTTP-Methoden GET und POST im Kontext einer REST-API.
Wähle zwei korrekte Aussagen.

  1. GET wird verwendet, um Daten vom Server sicher zu löschen.
  2. POST wird meist genutzt, um neue Daten oder Konfigurationen zu erstellen.
  3. GET-Anfragen dürfen den Zustand der Daten auf dem Server nicht verändern.
  4. POST-Anfragen sind auf 1024 Zeichen begrenzt.


4.1.4 In einer JSON-Antwort werden verschiedene Datentypen verwendet. Welche Aussagen zur Struktur sind korrekt?
Wähle zwei Antworten.

  1. Eckige Klammern [ ] kennzeichnen eine Liste (Array).
  2. Boole'sche Werte (True/False) müssen immer in Anführungszeichen stehen.
  3. Geschweifte Klammern { } umschließen ein Objekt (Dictionary).
  4. Zahlenwerte müssen in JSON immer als Text (Strings) übertragen werden.


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.

  1. ports["enabled"]["g0/4"]
  2. ports["g0/4"]["enabled"]
  3. ports["enabled"]
  4. ports.g0/4.enabled


4.2.2 Was passiert, wenn du die Schleife for x in ports: ausführst?
Wähle zwei korrekte Aussagen.

  1. x nimmt die Werte "g0/1", "g0/2" etc. an.
  2. x enthält das gesamte innere Dictionary (die Details).
  3. Mit ports[x] greift man auf die Port-Details zu.
  4. Die Schleife erfordert eine Nummerierung (0, 1, 2...).


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.

  1. ports["g0/3"].speed
  2. ports["g0/3"]["speed"]
  3. ports.get("speed")["g0/3"]
  4. 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.

  1. k ist ein Zähler (0, 1, ...), v ist der Port-Name.
  2. k ist der Port-Name, v ist das Dictionary mit den Details.
  3. k enthält "link", v enthält "speed".
  4. Beide Variablen erhalten das komplette Objekt.


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.


Wortliste und Satzbausteine



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.