Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m290_guko:learningunits:lu16:theorie:a_intro [2025/12/14 21:34] – gkoch | modul:m290_guko:learningunits:lu16:theorie:a_intro [2026/01/02 22:59] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 3: | Zeile 3: | ||
| ===== Lernziele ===== | ===== Lernziele ===== | ||
| - | * Sie können erklären, wie eine **HTTP-Anfrage** und eine **HTTP-Antwort** funktionieren. ((HTTP = „Hypertext Transfer Protocol“: | + | * Sie können erklären, wie eine **HTTP-Anfrage** und eine **HTTP-Antwort** funktionieren.((HTTP = „Hypertext Transfer Protocol“: |
| * Sie können die vier wichtigsten HTTP-Methoden **GET, POST, PUT, DELETE** den CRUD-Operationen zuordnen. | * Sie können die vier wichtigsten HTTP-Methoden **GET, POST, PUT, DELETE** den CRUD-Operationen zuordnen. | ||
| * Sie verstehen, was eine **API** und was eine **Route** in Express ist. | * Sie verstehen, was eine **API** und was eine **Route** in Express ist. | ||
| Zeile 23: | Zeile 23: | ||
| Jetzt übertragen wir diese Idee auf das **Web**: | Jetzt übertragen wir diese Idee auf das **Web**: | ||
| - | Statt direkt SQL zu tippen, schicken wir **HTTP-Anfragen** an einen **Backend-Server** ((Backend-Server = Programm, das Anfragen entgegennimmt und Antworten zurückschickt; | + | Statt direkt SQL zu tippen, schicken wir **HTTP-Anfragen** an einen **Backend-Server**((Backend-Server = Programm, das Anfragen entgegennimmt und Antworten zurückschickt; |
| Der Server führt für uns die passenden CRUD-Operationen aus und sendet eine Antwort zurück. | Der Server führt für uns die passenden CRUD-Operationen aus und sendet eine Antwort zurück. | ||
| - | Wir bauen zuerst eine **API für Social-Media-Posts**, | + | Wir bauen zuerst eine **API für Social-Media-Posts**, |
| So können wir **HTTP, Routen und Postman** kennenlernen, | So können wir **HTTP, Routen und Postman** kennenlernen, | ||
| + | |||
| + | <WRAP center round tip 70%> | ||
| + | Schauen Sie sich das Video zum Unterricht an – Einführung in APIs und Umsetzung von CRUD mit express: [[https:// | ||
| + | </ | ||
| ===== HTTP-Methoden – wie Bestellungen in einem Restaurant ===== | ===== HTTP-Methoden – wie Bestellungen in einem Restaurant ===== | ||
| Zeile 33: | Zeile 37: | ||
| Stellen Sie sich das so vor: | Stellen Sie sich das so vor: | ||
| - | * **Client** (Browser oder Postman) = Gast im Restaurant ((Client = Programm, das eine Anfrage sendet.)) | + | * **Client** (Browser oder Postman) = Gast im Restaurant((Client = Programm, das eine Anfrage sendet.)) |
| - | * **Server** (Express/ | + | * **Server** (Express/ |
| * **HTTP-Anfrage** = Bestellung, die der Kellner/die Kellnerin zur Küche bringt | * **HTTP-Anfrage** = Bestellung, die der Kellner/die Kellnerin zur Küche bringt | ||
| * **HTTP-Antwort** = fertiges Gericht, das der Kellner zurückbringt | * **HTTP-Antwort** = fertiges Gericht, das der Kellner zurückbringt | ||
| Zeile 41: | Zeile 45: | ||
| * eine **Methode** (z.B. '' | * eine **Methode** (z.B. '' | ||
| - | * einen **Pfad**((Pfad = der Teil der URL nach Domain/ | + | * einen **Pfad**((Pfad = der Teil der URL nach Domain/ |
| - | * optional einen **Body**((Body = „Datenkörper“ der Anfrage, z.B. ein JSON-Objekt.)) (z.B. JSON bei '' | + | * optional einen **Body**((Body = „Datenkörper“ der Anfrage, z.B. ein JSON-Objekt bei '' |
| Der Server reagiert auf eine Anfrage, indem er: | Der Server reagiert auf eine Anfrage, indem er: | ||
| Zeile 109: | Zeile 113: | ||
| <WRAP center round info 60%> | <WRAP center round info 60%> | ||
| - | Postman können Sie hier downloaden → [[[https:// | + | Postman können Sie hier downloaden → [[https:// |
| + | </ | ||
| {{: | {{: | ||
| Zeile 118: | Zeile 123: | ||
| ===== Beispiel-API: | ===== Beispiel-API: | ||
| - | Wir verwenden | + | Wir verwenden |
| * '' | * '' | ||
| Zeile 189: | Zeile 194: | ||
| </ | </ | ||
| - | Wenn Sie diesen Server mit '' | + | Wenn Sie diesen Server mit '' |
| Zeile 206: | Zeile 211: | ||
| === Test mit Postman oder Browser === | === Test mit Postman oder Browser === | ||
| - | {{: | + | {{: |
| * Methode: '' | * Methode: '' | ||
| Zeile 221: | Zeile 226: | ||
| <WRAP box round center 80%> <code javascript> | <WRAP box round center 80%> <code javascript> | ||
| // READ – einzelner Post nach ID | // READ – einzelner Post nach ID | ||
| - | app.get('/ | + | app.get(' |
| - | const id = Number(req.params.id); | + | const id = Number(req.params.id); |
| const post = posts.find(p => p.post_id === id); | const post = posts.find(p => p.post_id === id); | ||
| Zeile 235: | Zeile 240: | ||
| === Test mit Postman === | === Test mit Postman === | ||
| + | {{: | ||
| + | |||
| * Methode: '' | * Methode: '' | ||
| * URL: '' | * URL: '' | ||
| Zeile 251: | Zeile 258: | ||
| Dazu schicken wir einen im Request einen " | Dazu schicken wir einen im Request einen " | ||
| - | <WRAP box round center | + | <WRAP box round center |
| <code javascript> | <code javascript> | ||
| - | // CREATE – neuen Post anlegen | + | app.post(' |
| - | app.post('/ | + | //Daten aus dem Anfrage-Objekt (Request) holen und in Variablen speichern |
| - | // Holt sich die Daten aus der Request-Anfrage | + | const user_id |
| - | const { user_id, title, image_url, description | + | const title = req.body.title; |
| - | // Checken, ob wir auch die notwendigen Daten haben, um einen neuen Post zu speichern. | + | const image_url |
| - | if (!user_id | + | const description = req.body.description; |
| - | return res.status(400).send(' | + | |
| + | // ganz einfache Validierung (Pflichtfelder) - ohne titel oder user_id (wer post erstellt hat) können | ||
| + | if (!title || !user_id) { | ||
| + | return res.status(400).send(' | ||
| } | } | ||
| - | // neue ID bestimmen (hier: max + 1) – wird hier mathematisch gelöst | + | // neue post_id berechnen |
| - | const newId = posts.length | + | // Letzte Post-ID aus dem Post-Array herausfinden: |
| + | const lastPostId | ||
| + | const newPostId = lastPostId | ||
| const newPost = { | const newPost = { | ||
| - | | + | |
| - | user_id, | + | |
| - | title, | + | |
| - | image_url: image_url || '', | + | image_url: image_url || '', |
| - | description: | + | description: |
| - | likes: 0 | + | likes: 0 |
| }; | }; | ||
| + | //neuer Post wird in Post-Array (Liste mit Posts) gespeichert | ||
| posts.push(newPost); | posts.push(newPost); | ||
| + | // | ||
| res.status(201).json(newPost); | res.status(201).json(newPost); | ||
| + | |||
| + | |||
| }); | }); | ||
| </ | </ | ||
| </ | </ | ||
| - | **Test mit Postman** | + | ==== Erklärung ==== |
| + | |||
| + | Pflichtfelder: | ||
| + | |||
| + | Neue ID: Wir nehmen die '' | ||
| + | |||
| + | Antwort: '' | ||
| + | |||
| + | <WRAP center round info 80%> | ||
| + | Dieser Ansatz mit '' | ||
| + | | ||
| + | | ||
| + | |||
| + | In echten Projekten übernimmt das später die Datenbank (AUTO_INCREMENT). | ||
| + | </ | ||
| + | |||
| + | === Test mit Postman | ||
| + | |||
| + | {{: | ||
| - Methode: '' | - Methode: '' | ||
| - | - URL: '' | + | - URL: '' |
| - Tab '' | - Tab '' | ||
| - Beispiel-Body: | - Beispiel-Body: | ||
| Zeile 298: | Zeile 332: | ||
| </ | </ | ||
| - '' | - '' | ||
| - | | + | |
| - | * Status '' | + | * Status '' |
| - | * JSON-Objekt mit neuer '' | + | * JSON-Objekt mit neuer '' |
| - Anschliessend '' | - Anschliessend '' | ||
| Zeile 306: | Zeile 340: | ||
| ===== Ausblick ===== | ===== Ausblick ===== | ||
| - | In dieser Learning Unit haben Sie: | + | Auf der nächsten Seite sind die HTTP-Methoden |
| - | + | ||
| - | * die **HTTP-Methoden** im Kontext von CRUD kennengelernt, | + | |
| - | * mit **Postman** einfache Requests an Ihren Express-Server geschickt, | + | |
| - | * eine kleine API mit einer lokalen JavaScript-Liste (Array) von '' | + | |
| - | In der nächsten Unterrichtseinheit: | + | In der nächsten Unterrichtseinheit |
| * ersetzen wir die JavaScript-Liste durch eine **MySQL-Tabelle '' | * ersetzen wir die JavaScript-Liste durch eine **MySQL-Tabelle '' | ||
| - | * ergänzen **Update (PUT)** und **Delete (DELETE)** für vollständiges CRUD, | ||
| * bauen einfache **Validierung** und **Fehlerbehandlung** (HTTP-Statuscodes) ein, | * bauen einfache **Validierung** und **Fehlerbehandlung** (HTTP-Statuscodes) ein, | ||
| * damit Sie diese Struktur für Ihren eigenen Projekt-Use-Case übernehmen können. | * damit Sie diese Struktur für Ihren eigenen Projekt-Use-Case übernehmen können. | ||