Übungsaufgaben zu REST-APIs und HTTP
https://bildung.social/@oerinformatik/
https://oer-informatik.de/rest-api-uebungsaufgaben
REST-API, HTTP, CRUD, HTTP-Methoden, HTTP-Statuscodes, Idempotenz, URL, JSON, API-Sicherheit, Übungsaufgaben, Prüfungsvorbereitung
tl/dr; (Bearbeitungszeit insgesamt 91 min, mehrere Aufgaben): Vier Übungsaufgaben zu REST-Schnittstellen. Die ersten beiden drehen sich um Mitschnitte aus dem Test einer Terminbuchungs-API, die Du Sicherheitsrisiken zuordnest und mit Gegenmaßnahmen absicherst, sowie um den Sessionplan eines Barcamps: fehlerhafte URLs, eine unpassende GET-Anfrage, Statuscodes und REST oder SOAP. In den beiden umfangreichen Aufgaben danach übst Du: Fehlvorstellungen zu REST richtigstellen, Endpunkte REST-konform korrigieren und CRUD-Operationen zuordnen, eine abgelehnte HTTP-Anfrage reparieren, PUT und PATCH unterscheiden, Idempotenz erläutern, Statuscodes Situationen zuordnen, Pfad und Query-Parameter einer URL begründen, passende Methoden zum Ändern und Absagen wählen, eine HTTP-Anfrage selbst notieren, ein fehlerhaftes Python-Skript korrigieren und 404 und 410 abwägen. Alle Lösungen sind ausgeblendet und mit Punkteverteilung versehen [AI-Assisted]. (Zuletzt geändert am 29.10.2026)
Dieser Artikel ist Teil einer Artikelreihe über REST-Schnittstellen: Grundlagen: Representational State Transfer (REST) / Übungsaufgaben zu REST-APIs und HTTP / Übungsaufgaben zu REST: smarte Heizung und Industrieroboter
Diese Übungsaufgaben gehören zum Artikel Representational State Transfer (REST). Zwei weitere Fallbeispiele (smarte Heizung, Industrieroboter) findest Du unter Übungsaufgaben zu REST.
Hinweise zur Bearbeitung: Als FIA, FIDP oder FIDV musst Du zur Teil-2-Prüfung Aufgaben auf Kernkompetenz-Ebene lösen können, das sind Aufgabe 2.1 und Aufgabe 2.2. Von FIA wird zusätzlich erwartet, dass ihnen Aufgaben auf Profilkompetenz-Ebene (Aufgabe 3.1 und Aufgabe 3.2) keine Probleme bereiten. Notiere Deine Antworten zuerst vollständig, bevor Du die Beispiellösung aufklappst. Bei Erläuterungen zählt, dass Du Begriffe nicht nur nennst, sondern ihre Bedeutung am Beispiel zeigst; andere fachlich richtige Formulierungen sind ebenso richtig.
Du möchtest eigene Aufgaben zum Üben von einem KI-Sprachmodell generieren lassen?
Kopiere den Text in ein KI-Sprachmodell Deiner Wahl und passe Kompetenzstufe, Anzahl, Bearbeitungszeit und Szenario bei Bedarf an. Wie die Aufgaben aufgebaut sind, beschreibt der Artikel Wie sind die Aufgaben aufgebaut?. Prüfe die Ergebnisse mit dem Lehrartikel: KI-Sprachmodelle machen Fehler.
Erstelle neue Übungsaufgaben zum Thema „REST-APIs und HTTP“.
Bauplan: Halte Dich an Aufbau, Kompetenzstufen, Operatoren,
Anforderungsbereiche, Punkte und Zeitschätzung, die im Artikel
https://oer-informatik.de/aufgaben-aufbau beschrieben sind.
Fachliche Grundlage:
- https://oer-informatik.de/rest-grundlagen
- https://oer-informatik.de/uml-sequenzdiagramm
- Stilbeispiel: https://oer-informatik.de/rest-api-uebungsaufgaben
Die Aufgaben sollen Inhalte zu diesen Schlagwörtern abdecken:
- REST-API
- HTTP
- CRUD
- HTTP-Methoden
- HTTP-Statuscodes
- Idempotenz
- URL
- JSON
- API-Sicherheit
Kompetenzstufe: Kernkompetenz (alternativ: Basiskompetenz, Profilkompetenz, Expertise)
Anzahl: 1 Aufgabe mit Teilaufgaben
Bearbeitungszeit in Minuten ca.: <5 bis 30 min>
Szenario: eines der Szenarien aus dem Bauplan
Vorgehen:
1. Lies zuerst die verlinkten Artikel. Kannst Du keine Webseiten
abrufen, sag mir das, statt zu raten.
2. Steht bei einer Angabe noch ein Platzhalter in <…>, frag mich
zuerst danach. Richte Punkte und Zahl der Teilaufgaben nach der
Bearbeitungszeit (ca. 0,9 min je Punkt).
3. Gib je Aufgabe Titel mit Kompetenzstufe, Ausgangssituation und
Teilaufgaben mit Operator und Punktzahl aus, dazu die geschätzte
Bearbeitungszeit.
4. Gib die Beispiellösungen mit Punkteverteilung erst aus, wenn ich
danach frage.
Aufgabe 2.1: Die Terminbuchung der Fahrradwerkstatt prüfen (Kernkompetenz)
(ca. 16 min Bearbeitungszeit)
Die Werkstatt der CSB-Rad GmbH in Bielefeld-Sennestadt nimmt ab Januar 2027 Inspektionen und Reparaturen über den Onlineshop an. Ein externer Dienstleister hat dafür eine Programmierschnittstelle entworfen, die künftig auch die Werkstatt-App von Zweiradmechatronikerin Selin Arslan nutzen soll. Geschäftsführer Cem Sarıkaya bittet Dich, den Entwurf zu prüfen, bevor er freigegeben wird.
Vor der Freigabe hat der Dienstleister das Testsystem mit einem Werkzeug geprüft und folgende Mitschnitte geliefert. Das Testkonto mit der kunde_id 7 ist ein gewöhnliches Kundenkonto; alle Daten sind Testdaten.
Mitschnitt 1 – angemeldet mit dem Token von kunde_id 7:
GET /api/v1/termine/41 HTTP/1.1
Host: werkstatt.csb-rad.example
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI3In0.c2lnbmF0dXI
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 41, "datum": "2027-01-14", "uhrzeit": "09:00", "kunde_id": 2,
"leistung": "Inspektion E-Bike", "rahmennummer": "CSB2608EB0213"}
Mitschnitt 2 – angemeldet mit dem Token von kunde_id 7:
PATCH /api/v1/kunden/7 HTTP/1.1
Host: werkstatt.csb-rad.example
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI3In0.c2lnbmF0dXI
Content-Type: application/json
{"telefon": "0521 0100388", "rolle": "werkstattleitung"}
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 7, "telefon": "0521 0100388", "rolle": "werkstattleitung"}
Mitschnitt 3: Das Werkzeug sendet innerhalb einer Minute 600 Anmeldeversuche mit verschiedenen Passwörtern für dasselbe Benutzerkonto an POST /api/v1/login. Alle werden mit 401 Unauthorized beantwortet, der 601. Versuch mit dem richtigen Passwort mit 200 OK und einem Token.
Mitschnitt 4: GET /api/v1/termine?von=2020-01-01&bis=2027-12-31 liefert ohne Seitenaufteilung 18.400 Termine (41 MB) in einer Antwort. Während der neun Sekunden reagiert der Server auch für alle anderen Anfragen deutlich langsamer.
Für die Einordnung nutzt das Team einen Auszug aus den „OWASP API Security Top 10“ (2023):
| Kennung | Risiko |
|---|---|
| API1 | Broken Object Level Authorization: Die API prüft nicht, ob der angemeldete Client auf genau dieses Objekt (diesen Datensatz) zugreifen darf. |
| API2 | Broken Authentication: Anmeldung oder Token lassen sich umgehen oder erraten, z. B. weil Fehlversuche nicht begrenzt werden. |
| API3 | Broken Object Property Level Authorization: Der Client darf einzelne Eigenschaften eines Objekts lesen oder schreiben, die für ihn nicht bestimmt sind. |
| API4 | Unrestricted Resource Consumption: Anfragen dürfen unbegrenzt Rechenzeit, Speicher oder Datenmenge beanspruchen. |
| API5 | Broken Function Level Authorization: Der Client darf Funktionen aufrufen, die einer anderen Rolle vorbehalten sind. |
a) Mitschnitt 1 enthält einen gültigen Token und wird trotzdem als Sicherheitslücke gewertet. Erläutere, warum, und grenze dabei Authentifizierung und Autorisierung voneinander ab. (4 Punkte)
- Abgrenzung (2 Punkte): Bei der Authentifizierung prüft der Server, wer die Anfrage sendet (hier: gültiger Token von
kunde_id7). Bei der Autorisierung prüft er, ob diese Person die gewünschte Aktion an genau dieser Ressource ausführen darf. - Lücke (2 Punkte): Termin 41 gehört zu
kunde_id2. Der Server hat nur die Anmeldung geprüft, nicht, ob der Termin dem anfragenden Konto gehört. Wer die IDs einfach hochzählt, kann so Termine und Rahmennummern aller Kund*innen abrufen (Risiko API1). Die Antwort hätte403 Forbiddenoder404 Not Foundlauten müssen.
b) Ordne den Mitschnitten 2 bis 4 jeweils ein Risiko aus dem Auszug zu und begründe Deine Zuordnung. (6 Punkte)
Je Mitschnitt 2 Punkte (1 Punkt Zuordnung, 1 Punkt Begründung):
- Mitschnitt 2 – API3: Das eigene Kundenobjekt darf geändert werden, die Eigenschaft
rolleaber nicht. Der Server übernimmt alle mitgeschickten Felder ungeprüft; ein Kundenkonto macht sich so selbst zur Werkstattleitung. (API5 ist als Folge vertretbar, wenn begründet wird, dass das Konto danach Leitungsfunktionen nutzen kann.) - Mitschnitt 3 – API2: Fehlversuche werden nicht begrenzt, ein Passwort lässt sich durch Ausprobieren erraten (Brute Force). (API4 ist mit Begründung ebenfalls vertretbar.)
- Mitschnitt 4 – API4: Eine einzige Anfrage darf beliebig viele Datensätze abrufen und bindet dabei so viel Rechenzeit und Bandbreite, dass der Dienst für alle langsamer wird.
c) Beschreibe für zwei der Mitschnitte 2 bis 4 je eine Gegenmaßnahme, die der Dienstleister im API-Server umsetzen sollte. (4 Punkte)
Je beschriebener Maßnahme 2 Punkte, z. B.:
- Mitschnitt 2: Für jede Rolle festlegen, welche Felder geschrieben werden dürfen (Allowlist), und alle anderen Felder ablehnen (
400oder403). Rollen nur über eine eigene Verwaltungsfunktion der Leitung vergeben. - Mitschnitt 3: Fehlversuche je Konto und je IP-Adresse begrenzen (Rate Limiting), nach mehreren Fehlversuchen Wartezeiten erhöhen oder eine zusätzliche Prüfung verlangen, Fehlversuche protokollieren und auffällige Muster melden.
- Mitschnitt 4: Seitenaufteilung erzwingen (z. B. höchstens 100 Termine je Antwort mit
limitundoffset), den abfragbaren Zeitraum begrenzen und die Zahl der Anfragen je Client und Minute beschränken (429 Too Many Requests).
d) Die Werkstatt-App soll den Token künftig bei jeder Anfrage mitsenden. Der Dienstleister fragt, ob er ihn als Query-Parameter (…/termine/41?token=…) oder im Header Authorization übertragen soll. Begründe Deine Empfehlung. (3 Punkte)
Empfehlung Header Authorization (1 Punkt). Begründung (2 Punkte): URLs samt Query-Parametern landen in Server- und Proxy-Logs, im Verlauf und gegebenenfalls in weitergegebenen Links; ein dort mitgelesener Token erlaubt den Zugriff auf das Konto. Der Header ist der vorgesehene Ort für Zugangsdaten und wird über HTTPS genauso verschlüsselt wie der Rest der Anfrage, aber nicht als Teil der Adresse gespeichert.
Aufgabe 2.2: Den Sessionplan beim Barcamp abfragen (Kernkompetenz)
(ca. 17 min Bearbeitungszeit)
Beim Barcamp „Lernen.Digital.Leben 2027“ am 13.03.2027 holen sich die zehn Infomonitore des Ratz und Rübe Berufskollegs (RRB) den Sessionplan vom Info-Server im Servernetz. Der Info-Server stellt dafür eine REST-API bereit. Du unterstützt Emre Aksoy aus dem Orga-Team.
a) Der Endpunkt /api/v1/sessions des Info-Servers info.rrb-barcamp.example liefert Sessions; mit den Parametern raum und datum (Format JJJJ-MM-TT) lässt sich die Auswahl einschränken. Auf drei Monitoren sind folgende Adressen eingetragen. Alle sollen die Sessions in Raum A.104 am Barcamp-Tag anzeigen. Prüfe jede Adresse und korrigiere sie, falls nötig. (4 Punkte)
https://info.rrb-barcamp.example/api/v1/sessions?datum=2027-03-13&raum=A.104https://info.rrb-barcamp.example/api/v1/sessions?raum=A.104?datum=13.03.2027https://info.rrb-barcamp.example/api/v1/sessions/raum=A.104&datum=2027-03-13
- Adresse 1 (1 Punkt): richtig; die Reihenfolge der Query-Parameter ist beliebig.
- Adresse 2 (2 Punkte): zwei Fehler. Der zweite Parameter wird mit
&statt mit einem weiteren?angehängt, und das Datum steht im falschen Format. Richtig:…/sessions?raum=A.104&datum=2027-03-13. - Adresse 3 (1 Punkt): Das
?fehlt. Der Server deutetraum=A.104&datum=2027-03-13als Teil des Pfads, also als eigene Ressource, die es nicht gibt. Richtig:…/sessions?raum=A.104&datum=2027-03-13.
b) Ein Helfer schlägt vor, dass das Orga-Team spontan angemeldete Sessions über GET /api/v1/sessions/neu?titel=…&raum=… anlegt, „weil man das einfach in die Adresszeile des Browsers tippen kann“. Begründe, warum das nicht REST-konform ist, und gib an, welche Anfrage stattdessen verwendet werden sollte. (3 Punkte)
- Begründung (2 Punkte):
GETsoll nur lesen und keine Daten verändern (safe). Ein Browser, ein Link-Vorschau-Dienst oder ein erneutes Laden könnte die Anfrage wiederholen und Sessions doppelt anlegen. Außerdem gehört die Aktion („neu“) nicht in den Pfad, und die Daten landen in Browserverlauf und Server-Logs. - Stattdessen (1 Punkt):
POST /api/v1/sessionsmit den Daten der Session als JSON im Body, z. B. über eine Eingabemaske des Orga-Teams.
c) Am Morgen des Barcamps erhalten die Monitore folgende Statuscodes: 200, 404 und 503. Nenne für jeden Code die Statuscode-Klasse und was der Code für den Monitor bedeutet. (3 Punkte)
Je 1 Punkt:
200 OK– Klasse 2xx (Erfolg): Die Sessions wurden geliefert.404 Not Found– Klasse 4xx (Fehler des Clients): Die angefragte Ressource gibt es unter dieser URL nicht.503 Service Unavailable– Klasse 5xx (Fehler des Servers): Der Info-Server ist vorübergehend überlastet oder in Wartung.
d) Der Monitor in Raum B.012 meldet dauerhaft 404, alle anderen Monitore funktionieren. Beschreibe zwei mögliche Ursachen. (4 Punkte)
Je 2 Punkte, z. B.: Die URL ist auf diesem Monitor falsch eingetragen (Tippfehler im Pfad, z. B. /api/v1/session statt /sessions, oder alte Version /api/v0/…); der Raum ist als eigene Ressource angesprochen (/sessions/B.012), die es nicht gibt; die Raumbezeichnung im Info-Server lautet anders (z. B. B012), und die API behandelt einen unbekannten Raum im Filter als nicht vorhandene Ressource (sauberer wäre 200 OK mit leerer Liste, vgl. Aufgabe 3.2 c); der Monitor ruft einen anderen Server auf (z. B. wegen eines veralteten DNS-Eintrags), auf dem der Endpunkt fehlt.
e) Der Hersteller des Info-Servers bietet die Daten alternativ über eine SOAP-Schnittstelle an. Emre Aksoy winkt ab: „SOAP läuft nicht über HTTPS, und JSON kann es auch nicht.“ Prüfe beide Teilaussagen und begründe, ob die Monitore trotzdem besser die REST-API nutzen sollten. (4 Punkte)
- „nicht über HTTPS“ (1 Punkt): trifft nicht zu. SOAP-Nachrichten werden meist per
POSTüber HTTP bzw. HTTPS übertragen. - „kein JSON“ (1 Punkt): trifft zu. SOAP-Nachrichten sind XML-Dokumente mit Envelope, Header und Body.
- Empfehlung (2 Punkte), z. B. REST: Die Monitore brauchen nur einen
GET-Aufruf und einen JSON-Parser; die Antworten sind kleiner und lassen sich zwischenspeichern, weil sich der Sessionplan selten ändert. Eine begründete Entscheidung für SOAP ist ebenfalls richtig, z. B. wenn eine feste, maschinenlesbare Schnittstellenbeschreibung (WSDL) für ein anderes Programm gebraucht wird.
Aufgabe 3.1: Eine REST-API für Aktivitäten in einer Freizeit-App (Profilkompetenz)
(ca. 30 min Bearbeitungszeit)
Du bist Auszubildende*r bei der Let’s Meet GmbH in Bielefeld. In der App „Let’s Meet“ verabreden sich Menschen ab 16 Jahren zu gemeinsamen Freizeitaktivitäten an öffentlichen Treffpunkten. Das Entwicklungsteam baut das Backend neu auf: Ein Spring-Boot-Server mit MariaDB-Datenbank stellt den Apps für Android, iOS und das Web eine REST-API unter https://api.letsmeet.example/v1 bereit. Dein Mit-Azubi Jonas Weber soll die Endpunkte für Aktivitäten entwerfen. Yusuf Demir, Leiter der Entwicklung, bittet Euch, Jonas’ Entwurf gemeinsam zu prüfen.
a) Jonas hat sich vorab notiert: „REST heißt: Wir schicken JSON über HTTP. Jede Funktion bekommt einen eigenen Endpunkt, z. B. /v1/aktivitaetAnlegen oder /v1/aktivitaetLoeschen. Nach dem Login merkt sich der Server, wer angemeldet ist.“ Beurteile die drei Aussagen und stelle die zugrunde liegenden REST-Prinzipien am Beispiel der Aktivitäten richtig. (4 Punkte)
- „JSON über HTTP“ (1 Punkt): zu kurz gegriffen. JSON ist nur eine mögliche Repräsentation; REST ist ein Architekturstil mit mehreren Prinzipien, die über das Datenformat hinausgehen.
- „Eigener Endpunkt je Funktion“ (2 Punkte): trifft nicht zu. Jede Aktivität ist eine Ressource mit eindeutiger URI, z. B.
/v1/aktivitaeten/5, die Liste ist/v1/aktivitaeten. Was geschehen soll, steckt in der einheitlichen Schnittstelle der HTTP-Methoden:POST /v1/aktivitaetenlegt an,DELETE /v1/aktivitaeten/5löscht. Verben gehören nicht in den Pfad. - „Server merkt sich die Anmeldung“ (1 Punkt): trifft nicht zu. REST ist zustandslos: Jede Anfrage bringt alles mit, was der Server braucht, auch das Zugangstoken im Header. Dadurch kann jede Anfrage von einem beliebigen Server-Exemplar beantwortet werden.
Auch weitere Prinzipien (Client-Server-Trennung, Zwischenspeicherbarkeit, Hypermedia-Links) sind als Ergänzung richtig.
b) Jonas hat für die Aktivitäten folgende Endpunkte entworfen:
| Nr. | Funktion | Jonas’ Entwurf |
|---|---|---|
| 1 | alle Aktivitäten zum Hobby Klettern (Hobby 11) am 24.10.2026 suchen | GET /v1/aktivitaeten?hobby=11&datum=2026-10-24 |
| 2 | eine Bewertung löschen | GET /v1/bewertung/loeschen?id=17 |
| 3 | eine neue Aktivität anlegen | POST /v1/aktivitaeten/neu |
| 4 | die Teilnehmenden einer Aktivität abrufen | GET /v1/teilnehmendeVonAktivitaet?aktivitaet=3 |
| 5 | die angemeldete Person für den Feierabend-Kick (Aktivität 3) anmelden | GET /v1/aktivitaeten/3/anmelden?benutzer=2 |
Prüfe den Entwurf. Gib für jeden Endpunkt, der nicht REST-konform ist, eine korrigierte Fassung an und begründe die Korrektur kurz. Gib für die Endpunkte 2 bis 5 außerdem an, welche der CRUD-Grundoperationen sie ausführen. (8 Punkte)
Nr. 1 ist REST-konform (Ressource im Plural, Filter als Query-Parameter, GET zum Lesen). Für Nr. 2 bis 5 je 2 Punkte (1 Punkt korrigierter Endpunkt, 0,5 Punkte Begründung, 0,5 Punkte CRUD-Operation):
| Nr. | korrigiert | Begründung | CRUD |
|---|---|---|---|
| 2 | DELETE /v1/bewertungen/17 |
Die Aktion steckt in der Methode, nicht im Pfad; die Bewertung wird als Ressource über ihre ID im Pfad adressiert. GET darf keine Seiteneffekte haben (safe) – ein Link-Vorschau-Dienst oder Crawler könnte sonst Bewertungen löschen. |
Delete |
| 3 | POST /v1/aktivitaeten |
Kein Verb („neu“) im Pfad; POST auf die Sammlung legt eine neue Aktivität an, der Server vergibt die ID. |
Create |
| 4 | GET /v1/aktivitaeten/3/teilnahmen |
Untergeordnete Ressource im Pfad statt Verb-Endpunkt mit Parameter; Substantive statt „VonAktivitaet“. | Read |
| 5 | POST /v1/aktivitaeten/3/teilnahmen |
Eine Anmeldung legt eine neue Teilnahme an → POST, nicht GET (nicht safe, nicht idempotent). Wer sich anmeldet, ergibt sich aus dem Zugangstoken im Header Authorization, nicht aus einem Query-Parameter, den jede*r ändern könnte. |
Create |
Auch PUT /v1/aktivitaeten/3/teilnahmen/2 für Nr. 5 ist vertretbar (der Client kennt die URI der neuen Teilnahme).
c) Kim Bauer hat die Aktivität 5 („Bouldern für Einsteiger*innen“) erstellt und möchte die Höchstzahl der Teilnehmenden von 5 auf 6 erhöhen. Eine Testfassung der App sendet dazu folgende Anfrage und erhält die Antwort 401 Unauthorized:
PATCH /v1/aktivitaeten/5 HTTP/1.1
Host: api.letsmeet.example
Content-Type: text/plain
maxTeilnehmende=6
Erläutere, warum der Server mit 401 antwortet. Schreibe die Anfrage so neu, dass der Server sie annimmt, und begründe jede Änderung mit der Aufgabe des jeweiligen Bestandteils (Startzeile, Header, Body). (5 Punkte)
PATCH /v1/aktivitaeten/5 HTTP/1.1
Host: api.letsmeet.example
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1In0.c2lnbmF0dXI
Content-Type: application/json
Accept: application/json
{"maxTeilnehmende": 6}
- Ursache
401(1 Punkt): Die Anfrage enthält keine Zugangsdaten. Der Server kann nicht feststellen, wer sie sendet, und lehnt sie ab, bevor er den Body überhaupt auswertet. - Header
Authorization(1 Punkt): überträgt das Token der angemeldeten Person (Kim Bauer); damit prüft der Server Identität und Berechtigung (nur die erstellende Person darf ändern). - Header
Content-Type: application/json(1 Punkt): teilt dem Server das Format des Bodys mit; die API verarbeitet JSON. Mittext/plainkäme nach dem Anmelden als Nächstes415 Unsupported Media Type.Acceptgibt an, dass die App die Antwort als JSON erwartet. - Body (1 Punkt): Nutzdaten als JSON mit genau dem Attribut, das sich ändern soll; die Zahl ohne Anführungszeichen.
- Startzeile (1 Punkt): bleibt unverändert richtig: Methode
PATCH(Ressource teilweise ändern), Pfad/v1/aktivitaeten/5(API-Version 1, Aktivität mit der ID 5) und Protokollversion.
d) Jonas fragt, warum die App nicht die Methode PUT verwendet. Erläutere den Unterschied zwischen PUT und PATCH und was passieren würde, wenn die App denselben (korrigierten) Body mit PUT senden würde. (3 Punkte)
PUTersetzt die Ressource vollständig durch die mitgesendete Repräsentation; der Body muss also alle Attribute der Aktivität enthalten (Titel, Beschreibung, Treffpunkt, Beginn, Dauer …). (1 Punkt)PATCHändert die Ressource teilweise; der Body enthält nur die zu ändernden Attribute. (1 Punkt)Mit
PUTund dem Body{"maxTeilnehmende": 6}würden alle übrigen Attribute fehlen: Je nach Umsetzung lehnt der Server die Anfrage ab (z. B.400 Bad Request, weil Pflichtfelder fehlen), oder er setzt die fehlenden Attribute auf leer bzw. Standardwerte – Titel, Treffpunkt und Beginn gingen verloren. (1 Punkt)
e) In einem Funkloch sendet die App die korrigierte Anfrage aus c) versehentlich zweimal. Erläutere mithilfe des Begriffs idempotent, warum das hier unkritisch ist, eine doppelt gesendete Anmeldung nach b) Nr. 5 (mit POST) dagegen nicht. (3 Punkte)
Idempotent ist eine Anfrage, wenn sie mehrfach ausgeführt denselben Zustand auf dem Server hinterlässt wie einmal ausgeführt. (1 Punkt)
Die Anfrage aus c) setzt die Höchstzahl auf den festen Wert 6. Ein zweites Mal ändert nichts mehr – sie wirkt idempotent. (1 Punkt) Hinweis:
PATCHist laut Standard nicht grundsätzlich idempotent (z. B. bei „erhöhe um 1“);PUT,GETundDELETEsind es immer.POSTist nicht idempotent: Jede Anfrage legt eine neue Ressource an. Eine doppelt gesendete Anmeldung könnte zwei Teilnahmen erzeugen und einen weiteren Platz belegen. Der Server muss das verhindern, etwa durch eine Prüfung auf bestehende Teilnahme (Antwort409 Conflict). (1 Punkt)
f) Ordne den Situationen jeweils den passenden Statuscode aus der folgenden Liste zu: 200, 201, 204, 400, 401, 403, 404, 405, 409, 500. Nicht alle Codes werden benötigt. Erläutere anschließend, woran Du am Statuscode erkennst, ob die Ursache eines Fehlers beim Client oder beim Server liegt. (10 Punkte)
| Nr. | Situation | Statuscode |
|---|---|---|
| 1 | Die Startseite fragt die Aktivitäten der nächsten sieben Tage ab und erhält die Liste im Body. | |
| 2 | Sabine Hoffmann legt eine neue Wanderung an; die Antwort enthält im Header Location die URI der neuen Aktivität. |
|
| 3 | Die App sendet eine Anfrage mit einem abgelaufenen Zugangstoken. | |
| 4 | Noah Bergmann (17 Jahre) ruft die Detailseite des Kochabends mit Weinbegleitung auf (Mindestalter 18). | |
| 5 | Ein alter Link zeigt auf /v1/aktivitaeten/99; diese Aktivität gibt es nicht. |
|
| 6 | Im Body steht "maxTeilnehmende": 25; erlaubt sind 2 bis 20. |
|
| 7 | Lea Schmitt sendet eine Anmeldung zu einer Aktivität, zu der sie bereits angemeldet ist. | |
| 8 | Im Backend tritt eine nicht behandelte Ausnahme auf, weil der Datenbank-Container abgestürzt ist. |
Zuordnung je Zeile 1 Punkt:
| Nr. | Statuscode | Erläuterung |
|---|---|---|
| 1 | 200 OK |
erfolgreicher Abruf, Daten im Body |
| 2 | 201 Created |
Ressource angelegt, URI im Header Location |
| 3 | 401 Unauthorized |
nicht (gültig) authentifiziert |
| 4 | 403 Forbidden |
angemeldet, aber nicht berechtigt (Schutz Minderjähriger); 404 ist ebenfalls vertretbar, wenn die API gar nicht verraten soll, dass es die Aktivität gibt |
| 5 | 404 Not Found |
unter dieser URI gibt es keine Ressource |
| 6 | 400 Bad Request |
ungültige Daten in der Anfrage (in der Praxis auch 422 Unprocessable Content) |
| 7 | 409 Conflict |
Widerspruch zum aktuellen Zustand (Teilnahme besteht bereits) |
| 8 | 500 Internal Server Error |
Fehler im Server, nicht in der Anfrage (503 Service Unavailable wäre bei angekündigter Nichtverfügbarkeit passend, steht aber nicht in der Liste) |
204 und 405 werden nicht benötigt.
Erkennen (2 Punkte): An der ersten Ziffer. Codes der Klasse 4xx (hier 400, 401, 403, 404, 409) bedeuten, dass die Anfrage fehlerhaft oder unzulässig ist; die App muss sie ändern, eine unveränderte Wiederholung hilft nicht. Codes der Klasse 5xx (hier 500) bedeuten, dass die Anfrage in Ordnung war, der Server sie aber nicht bearbeiten konnte; eine spätere Wiederholung kann gelingen. 2xx steht für Erfolg.
Aufgabe 3.2: Fahrtangebote auf Flurmonitoren und in der Mitfahr-App (Profilkompetenz)
(ca. 28 min Bearbeitungszeit)
Du arbeitest im FIA-Projektteam des Ratz und Rübe Berufskollegs in Bielefeld an der Mitfahr-App „RatzFahrt“. Auszubildende bieten darin Fahrten zur Schule an oder suchen eine Mitfahrgelegenheit. Das Backend stellt eine REST-API unter https://api.ratzfahrt.example/v1 bereit. Die vier Flurmonitore der Schule zeigen über einen Mini-Player (Raspberry Pi im VLAN 520) offene Angebote und Gesuche an – anonym, also nur Ort, Treffpunkt, Richtung, Zeit und Plätze. Heute ist Montag, der 19.10.2026.
Der Player im Foyer sendet morgens folgende Anfrage:
GET https://api.ratzfahrt.example/v1/monitor/eintraege?haltepunkt=1&richtung=zur-schule&datum=2026-10-19&max=10
a) Erläutere anhand dieser URL, welche Teile der Server auswertet, um den richtigen Endpunkt zu finden, und welche Teile er als Filter verwendet. Begründe, warum Haltepunkt und Datum hier als Query-Parameter und nicht als Teil des Pfads übergeben werden. (3 Punkte)
- Endpunkt (1 Punkt): Schema
https, Hostapi.ratzfahrt.exampleund Pfad/v1/monitor/eintraege(API-Version 1, Ressource „Einträge für die Monitoranzeige“) bestimmen, welcher Server und welcher Endpunkt die Anfrage bearbeitet. - Filter (1 Punkt): Der Query-Teil nach dem
?mit den durch&getrennten Parameternhaltepunkt=1,richtung=zur-schule,datum=2026-10-19undmax=10schränkt die Auswahl ein bzw. begrenzt die Zahl der Einträge. - Begründung (1 Punkt): Der Pfad bezeichnet eine Ressource, hier die Sammlung der Einträge. Haltepunkt, Richtung, Datum und Höchstzahl sind wahlweise kombinierbare Filter auf diese Sammlung, keine eigenen Ressourcen. Als Query-Parameter können sie fehlen oder in beliebiger Reihenfolge stehen, ohne dass für jede Kombination ein eigener Pfad nötig ist.
Der Server antwortet:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=60
[{"art": "Angebot", "ort": "Gütersloh", "treffpunkt": "Hauptbahnhof, ZOB Steig 3", "richtung": "zur Schule", "datum": "2026-10-19", "zeit": "07:00", "plaetze": 2}]
ba) Beschreibe die drei Bestandteile dieser Antwort und ihre Bedeutung im Beispiel. (3 Punkte)
Je Bestandteil 1 Punkt:
Statuszeile
HTTP/1.1 200 OK: Protokollversion und Statuscode;200bedeutet, dass die Anfrage erfolgreich bearbeitet wurde.Header (Metainformationen):
Content-Type: application/jsongibt an, dass der Body JSON enthält;Cache-Control: max-age=60erlaubt, die Antwort 60 Sekunden zwischenzuspeichern.Body (Nutzdaten): eine JSON-Liste mit einem Eintrag – das Angebot ab Gütersloh Hbf um 07:00 Uhr mit zwei freien Plätzen –, ohne Namen oder Pseudonyme, wie es die anonyme Anzeige verlangt.
bb) Erläutere, warum der Server einem Zwischenspeicher (Cache) hier erlauben kann, die Antwort 60 Sekunden lang wiederzuverwenden. (2 Punkte)
GETist safe: Die Anfrage liest nur und verändert nichts. Wird eine gespeicherte Antwort wiederverwendet, statt den Server erneut zu fragen, fehlt keine Wirkung auf dem Server – Antworten aufGETsind daher grundsätzlich zwischenspeicherbar (cacheable). (1 Punkt)Die Anzeige auf den Fluren muss nicht sekundengenau sein; eine höchstens 60 Sekunden alte Liste reicht. Der Cache entlastet Server und Netz, weil vier Monitore nicht ständig dieselben Daten abrufen. (1 Punkt)
c) Der Monitor am Ausgang Parkplatz C soll nachmittags offene Einträge in Richtung „nach Hause“ für den Haltepunkt Bad Salzuflen Busbahnhof (ID 4) am Donnerstag, 22.10.2026, anzeigen, höchstens 5 Einträge. Vervollständige die URL. (3 Punkte)
https://api.ratzfahrt.example …
https://api.ratzfahrt.example/v1/monitor/eintraege?haltepunkt=4&richtung=nach-hause&datum=2026-10-22&max=5
1 Punkt für den Pfad mit Version und Endpunkt (/v1/monitor/eintraege), 1 Punkt für die vier Parameter mit richtigen Werten, 1 Punkt für die Syntax (? vor dem ersten, & zwischen den Parametern, keine Leerzeichen).
Gibt es keine passenden Einträge, antwortet der Server mit 200 OK und einer leeren Liste [] – nicht mit 404, denn die Ressource „Einträge“ existiert, sie ist nur leer.
d) Ben Richter verwaltet sein Fahrtangebot 1 über den Endpunkt /v1/angebote. Er möchte (1) die Zahl der freien Plätze auf 1 senken, weil eine Kollegin fest mitfährt, und (2) das Angebot absagen, weil er krank ist. Die Web-App soll außerdem (3) beim Start abfragen, welche Methoden der Endpunkt /v1/angebote erlaubt. Notiere für jeden Fall Methode und Pfad, bei (1) und (2) auch den Body, und begründe, warum Du in Fall (2) nicht DELETE verwendest. (5 Punkte)
Je Anfrage 1 Punkt, Begründung 2 Punkte:
PATCH /v1/angebote/1mit{"freiePlaetze": 1}– nur ein Attribut ändert sich (auchPUTmit allen Daten des Angebots ist richtig).PATCH /v1/angebote/1mit{"status": "abgesagt"}OPTIONS /v1/angebote– die Antwort nennt im HeaderAllowdie erlaubten Methoden.
Begründung: Mit DELETE wäre das Angebot verschwunden. Die Mitfahrenden, die schon zugesagt haben, sehen dann nur noch eine Fehlermeldung statt des Hinweises „abgesagt“ und können nicht gezielt benachrichtigt werden. Gelöscht wird erst später nach der Löschregel.
e) Ben Richter bietet für Mittwoch, 21.10.2026, eine Fahrt ab Gütersloh Hbf (Haltepunkt 1) zur Schule an: Abfahrt 07:00 Uhr, 2 freie Plätze, Kostenbeitrag 1,80 €, mit seinem PKW (Fahrzeug 1). Notiere die vollständige HTTP-Anfrage der App: Startzeile mit Methode und Pfad, die nötigen Header und den Body im JSON-Format. Gib außerdem an, mit welchem Statuscode der Server bei Erfolg antworten sollte. (5 Punkte)
POST /v1/angebote HTTP/1.1
Host: api.ratzfahrt.example
Authorization: Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxIn0.c2lnbmF0dXI
Content-Type: application/json
Accept: application/json
{"haltepunktId": 1, "richtung": "zur Schule", "datum": "2026-10-21", "abfahrt": "07:00", "freiePlaetze": 2, "kostenbeitragEur": 1.80, "fahrzeugId": 1}
Startzeile mit
POSTauf die Sammlung/v1/angebote(1 Punkt)Header
Content-Type: application/jsonundAuthorizationmit dem Token aus dem Single Sign-on (1 Punkt);HostundAcceptsind sinnvoll, werden aber nicht gefordert.Body als gültiges JSON mit allen Angaben in passenden Datentypen (Zahlen ohne Anführungszeichen, Datum im Format
JJJJ-MM-TT) (2 Punkte)Statuscode
201 Created, im HeaderLocationdie URI des neuen Angebots, z. B./v1/angebote/8(1 Punkt)
Wer fährt, steht nicht im Body: Der Server entnimmt die fahrende Person dem Token, sonst könnte jede*r Angebote im Namen anderer anlegen. Ergänzend: Haltepunkt 1 liegt 18,6 km von der Schule entfernt; bei höchstens 0,10 € je km liegt der Kostenbeitrag mit 1,80 € unter der Obergrenze von 18,6 km · 0,10 €/km = 1,86 €.
f) Jonas Wolff hat ein Python-Skript für den Player des Monitors im Flur B2 (Monitor 3) geschrieben. Es soll jede Minute den Zustand des Monitors an das Backend melden. Die API-Dokumentation beschreibt den Endpunkt so:
| Angabe | Festlegung |
|---|---|
| Endpunkt | PUT /v1/monitore/{id}/status |
| Zweck | Der Player meldet, ob der Monitor läuft und mit welcher Helligkeit (Prozent). |
| Authentifizierung | Header X-API-Key mit dem Schlüssel des Monitors; nur über HTTPS |
| Body | JSON, z. B. {"online": true, "helligkeit": 100} |
| Antworten | 204 Status gespeichert (ohne Body) · 400 Body ungültig · 401 Schlüssel fehlt oder falsch · 404 Monitor unbekannt · 405 Methode nicht erlaubt |
1 import time
2 import requests
3
4 API = "http://api.ratzfahrt.example/v1"
5 MONITOR_ID = 3
6 SCHLUESSEL = "m3-7f3a9c2e"
7
8 def melde_status(helligkeit):
9 daten = {"online": True, "helligkeit": helligkeit}
10 url = API + "/monitore/" + str(MONITOR_ID) + "/status?key=" + SCHLUESSEL
11 antwort = requests.get(url, json=daten, timeout=5)
12 if antwort.status_code != 200:
13 print("Statusmeldung fehlgeschlagen:", antwort.status_code)
14
15 while True:
16 melde_status(100)
17 time.sleep(60)Beim Test gibt das Skript jede Minute „Statusmeldung fehlgeschlagen: 405“ aus.
fa) Beschreibe die Ursache für den Statuscode 405 und korrigiere die betroffene Zeile. (3 Punkte)
Ursache (2 Punkte):
405 Method Not Allowedheißt, dass die Ressource existiert, aber mit einer Methode angesprochen wird, die der Server für sie nicht erlaubt. Zeile 11 verwendetGET(nur lesen), laut Dokumentation muss der Status mitPUTgesendet werden.Korrektur Zeile 11 (1 Punkt):
11 antwort = requests.put(url, json=daten, timeout=5)fb) Das Skript enthält weitere Fehler bzw. Mängel. Identifiziere zwei davon mit Zeilennummer und behebe sie. (4 Punkte)
Je Mangel 2 Punkte (1 Punkt Identifizieren mit Begründung, 1 Punkt Korrektur); zwei der folgenden:
Zeile 4:
httpstatthttps– die Verbindung ist unverschlüsselt, der Schlüssel könnte im Schulnetz mitgelesen werden; die API erlaubt nur HTTPS.4 API = "https://api.ratzfahrt.example/v1"Zeile 10: Der API-Schlüssel steht als Query-Parameter in der URL. Laut Dokumentation gehört er in den Header
X-API-Key; in der URL landet er außerdem in Server- und Proxy-Logs.10 url = API + "/monitore/" + str(MONITOR_ID) + "/status" 11 antwort = requests.put(url, json=daten, headers={"X-API-Key": SCHLUESSEL}, timeout=5)Zeile 12: Bei Erfolg antwortet der Server mit
204, nicht mit200. Das Skript würde also auch nach der Korrektur jede erfolgreiche Meldung als Fehler ausgeben.12 if antwort.status_code != 204:(Auch
if not antwort.ok:– alle Codes unter 400 gelten als Erfolg – ist richtig.)Zeilen 11 und 16: Ist das Backend nicht erreichbar oder antwortet es nicht innerhalb von 5 Sekunden, löst
requestseine Ausnahme aus (z. B.ConnectionError,Timeout). Sie wird nicht abgefangen, das Skript bricht ab und meldet danach gar keinen Status mehr.15 while True: 16 try: 17 melde_status(100) 18 except requests.exceptions.RequestException as fehler: 19 print("Statusmeldung fehlgeschlagen:", fehler) 20 time.sleep(60)
g) Lukas Hofmann tippt in seiner Übersicht „Meine Fahrten“ auf ein Angebot vom Vortag. Die App ruft GET /v1/angebote/7 auf. Angebot 7 wurde gestern abgesagt und heute Nacht nach der Löschregel entfernt; der Server antwortet mit 404 Not Found. Beurteile, ob 410 Gone hier die passendere Antwort wäre, und beschreibe, wie die App mit der Antwort umgehen sollte. (3 Punkte)
- Beurteilung (2 Punkte):
410 Gonesagt genauer, dass es die Ressource gab und sie dauerhaft entfernt wurde; ein404lässt offen, ob die URL je gültig war. Damit kann die App „Dieses Angebot wurde gelöscht“ statt einer allgemeinen Fehlermeldung anzeigen. Dafür muss sich der Server aber merken, welche IDs gelöscht wurden. Ist das nicht gewünscht (Datensparsamkeit, Aufwand), ist404ebenfalls korrekt. - Umgang in der App (1 Punkt): eine verständliche Meldung zeigen und den veralteten Eintrag aus der lokal zwischengespeicherten Übersicht entfernen bzw. die Übersicht neu laden, statt die Anfrage zu wiederholen.
Links und weitere Informationen
zum Nachlesen: Representational State Transfer (REST)
weitere Übungen: Übungsaufgaben zu REST
zur Darstellung von Abläufen zwischen App, Webservice und Datenbank: UML-Sequenzdiagramm
als Nachschlagewerk für Methoden, Header und Statuscodes: MDN Web Docs: HTTP und RFC 9110 „HTTP Semantics“
Hinweis zur Nachnutzung als Open Educational Resource (OER)
Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zu REST-APIs und HTTP” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/rest-api-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/software-entwurf/web-schnittstellen. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 29.10.2026.
[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]
