- Neuer Termin, liegt bewusst vor Spring Boot
- Heute kein Framework-Code: nur HTTP, JSON und fetch
- Roter Faden: heute die Sprache zwischen den beiden Haelften, naechste Woche die Serverseite
- Praktikum: nach dem Projektwechsel baut ihr ein Projekt, das ein anderes Team entworfen hat; die API ist dort der Vertrag
- Beide Varianten sind legitim; rechts ist das, was man heute meist "REST-API" nennt
- Anknuepfung web-05: products.json per fetch geladen, das war schon eine (sehr einfache) Web-API
- HTTP kennt ihr aus web-02 als Request/Response-Bild; heute schauen wir in die Nachrichten hinein
- Zustandslos heisst nicht, dass es keine Datenbank gibt; es heisst, dass die Verbindung selbst kein Gedaechtnis hat
- Deshalb schickt der Client z.B. ein Token (Zugangsnachweis) bei jedem Request mit
- Laufendes Beispiel fuer heute und beide Spring-Boot-Termine: ein Team-Board mit Aufgaben (Tasks)
- Hier: im Team 3 eine neue Task anlegen
- Praefix /api trennt die JSON-Schnittstelle von den HTML-Seiten derselben Anwendung
- HTTP/2 und HTTP/3 kodieren binaer, die Bestandteile bleiben dieselben
- 201 Created statt 200: es wurde etwas Neues angelegt
- ID und Startstatus OPEN vergibt der Server, deshalb stehen sie nur in der Response
- Live zeigen: beliebige Seite, Network-Tab, Filter "Fetch/XHR"
- Authorization nur als Begriff; Anmeldung und Tokens kommen mit Spring Security
- Uebergang: HTTP ist das Transportmittel, REST ist die Art, eine API darauf zu entwerfen
- Sechste Regel "Code on Demand" ist optional und fuer uns egal
- Im Alltag meint "REST-API" meist: HTTP + JSON + Ressourcen-URLs; das ist nicht ganz Fieldings Definition, aber der uebliche Sprachgebrauch
- Links funktioniert technisch auch, ist aber kein REST: jede API erfindet eigene Verben
- GET /api/teams/3/delete ist gefaehrlich: Browser, Crawler und Link-Vorschauen rufen GET-Links ungefragt auf
- Kein Naturgesetz, aber verbreitete Konvention; wichtiger als die Regel ist, dass die API in sich einheitlich ist
- Plural auch fuer das Einzelelement: /api/tasks/17, nicht /api/task/17
- Die Substantive haben wir; jetzt die Verben
- CRUD (Create, Read, Update, Delete) kennen sie aus der Datenbank-Welt
- CORS (Cross-Origin Resource Sharing) nur erwaehnen; wird relevant, wenn Front-End und Back-End auf verschiedenen Ports laufen
- Praktische Bedeutung: doppelt abgeschicktes Formular per POST legt zwei Tasks an, per PUT nicht
- Klausurtypisch: Methode einordnen und die Einordnung begruenden
- Merksatz: PUT schickt die ganze Ressource, PATCH nur die Aenderung
- Formal gibt es fuer PATCH eigene Formate (JSON Merge Patch, RFC 7396); im Projekt reicht das obige Muster
- Typischer PATCH-Fall: eine Task auf dem Board per Drag-and-drop in die naechste Spalte ziehen
- Diese Tabelle ist das Referenzbeispiel fuer die Klausur und fuer eure eigene API
- Die Erfolgscodes schauen wir uns gleich im naechsten Abschnitt an
- In Spring Boot Teil 2 implementieren wir davon die fuenf Task-Endpunkte ohne PATCH, Zeile fuer Zeile
- Loesung: 1 GET /events?from=2026-12-01&to=2026-12-31 · 2 POST /events · 3 GET /events/{id} · 4 POST /events/{id}/registrations · 5 PATCH /events/{id} · 6 DELETE /registrations/{id}
- Diskussionspunkt 4: "Anmelden" ist keine Aktion, sondern das Anlegen einer Ressource "Anmeldung"
- Varianten sammeln; unterschiedliche, aber einheitliche Loesungen sind in Ordnung
- Kleiner Rueckgriff: http.cat aus web-03 war schon ein Statuscode-Bild
- Wer die Klasse kennt, kann auch unbekannte Codes grob einordnen
- Das ist die Frage, die ein Client zuerst stellt: muss ich etwas aendern oder nur warten?
- 401 vs. 403 ist der Klassiker: 401 = Identitaet unbekannt, 403 = Identitaet bekannt, Recht fehlt
- 400 vs. 422: kaputte Syntax gegen gueltige Syntax mit falschem Inhalt; manche APIs nehmen fuer beides 400, das ist vertretbar
- Genau so macht es Spring Boot Teil 2: Validierungsfehler (auch das Datum in der Vergangenheit) werden dort 400
- Loesung: 1 → 404 · 2 → 409 · 3 → 400 · 4 → 204 · 5 → 403 (angemeldet, aber nicht berechtigt) · 6 → 500 · 7 → 201 mit Location
- Bei 5 nachfragen: was waere, wenn sie gar nicht angemeldet waere? → 401
- Jetzt der Inhalt der Nachrichten und die Clientseite mit fetch
- Daher der Name: Representational State Transfer, uebertragen wird eine Repraesentation, nicht das Objekt selbst
- Dieselbe Ressource koennte auch als HTML oder CSV geliefert werden; der Accept-Header waehlt aus
- archived, labels und description zeigen hier nur die JSON-Typen; die Task in Spring Boot Teil 2 ist schlanker (id, title, dueDate, status, teamId)
- Die wichtigste Regel des Abschnitts: der Code traegt die Bedeutung, der Body liefert Details
- Eigene Felder sind erlaubt, z.B. eine Liste "errors" mit Feld und Meldung bei 422
- Spring Boot kann dieses Format von Haus aus, das sehen wir naechste Woche
- Das ist exakt der Request von der Anatomie-Folie, nur aus JavaScript heraus
- Task ist ein TypeScript-Interface mit id, title, dueDate, status, teamId
- Den response.ok-Check kennt ihr aus web-05; jetzt wisst ihr, warum er noetig ist
- Haeufigster Anfaengerfehler: nur try/catch, dann landet ein 409 im Erfolgszweig
- Nach dem Projektwechsel arbeitet ihr auf fremdem Entwurf; eine klar notierte API spart dort am meisten Rueckfragen
- Beispiel-JSON als statische Datei, z.B. fetch("/mock/tasks.json"), traegt bis zum echten Back-End
- OpenAPI nur nennen, nicht vertiefen
- Kurz zusammenfassen, dann Ausblick auf Spring Boot
- Jede Zeile ist eine moegliche Klausurfrage
- Klausur: REST-Aufgabe mit ca. 4 bis 6 Punkten, Stil wie die beiden Uebungen von heute
- Das Team-Board bleibt: Teil 1 nutzt es in der Routing-Uebung, Teil 2 (16.12.) implementiert genau diese Task-API Zeile fuer Zeile
- Zeit fuer Rueckfragen lassen
- Falls keine kommen: fragen, welcher Statuscode am meisten verwirrt hat