Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m290_guko:learningunits:lu16:theorie:a_intro [2026/08/13 16:06] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m290_guko:learningunits:lu16:theorie:a_intro [2026/08/13 16:12] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden 216.73.216.62 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== LU16 – HTTP, CRUD & Postman ====== | ||
| + | |||
| + | ===== Lernziele ===== | ||
| + | |||
| + | * 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 verstehen, was eine **API** und was eine **Route** in Express ist. | ||
| + | * Sie können mit **Postman** einfache Requests an Ihren Express-Server schicken. | ||
| + | * Sie können erste **CRUD-Routen** für '' | ||
| + | |||
| + | ===== Von SQL-CRUD zu Web-CRUD ===== | ||
| + | |||
| + | Bisher im Modul M290: | ||
| + | |||
| + | * Sie haben in **MySQL** Tabellen erstellt, Daten importiert und Abfragen geschrieben. | ||
| + | * Sie kennen **CRUD**: | ||
| + | * **C**reate → '' | ||
| + | * **R**ead → '' | ||
| + | * **U**pdate → '' | ||
| + | * **D**elete → '' | ||
| + | |||
| + | {{de: | ||
| + | |||
| + | 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; | ||
| + | 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**, | ||
| + | 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 ===== | ||
| + | |||
| + | Stellen Sie sich das so vor: | ||
| + | |||
| + | * **Client** (Browser oder Postman) = Gast im Restaurant((Client = Programm, das eine Anfrage sendet.)) | ||
| + | * **Server** (Express/ | ||
| + | * **HTTP-Anfrage** = Bestellung, die der Kellner/die Kellnerin zur Küche bringt | ||
| + | * **HTTP-Antwort** = fertiges Gericht, das der Kellner zurückbringt | ||
| + | |||
| + | Jede HTTP-Anfrage hat unter anderem: | ||
| + | |||
| + | * eine **Methode** (z.B. '' | ||
| + | * einen **Pfad**((Pfad = der Teil der URL nach Domain/ | ||
| + | * optional einen **Body**((Body = „Datenkörper“ der Anfrage, z.B. ein JSON-Objekt bei '' | ||
| + | |||
| + | Der Server reagiert auf eine Anfrage, indem er: | ||
| + | |||
| + | - eine passende **Route** findet (z.B. '' | ||
| + | - etwas ausführt (z.B. Daten lesen oder speichern), | ||
| + | - genau **eine** Antwort zurückschickt (z.B. JSON oder Text). | ||
| + | |||
| + | {{de: | ||
| + | |||
| + | |||
| + | |||
| + | ===== Route und Endpoint ===== | ||
| + | |||
| + | ==== Route (Express) ==== | ||
| + | Eine **Route** ist die **Server-Funktion im Code**, die beschreibt, was bei einer bestimmten Kombination passiert: | ||
| + | |||
| + | * **HTTP-Methode + Pfad** (z.B. '' | ||
| + | * **Handler-Funktion**((Handler = Funktion, die ausgeführt wird, wenn die Route passt.)) (z.B. Daten lesen, JSON senden) | ||
| + | |||
| + | <WRAP center round box 70%> | ||
| + | <code javascript> | ||
| + | (req, res) => { | ||
| + | res.send(' | ||
| + | } | ||
| + | </ | ||
| + | //Das hier ist die Handler-Funktion. '' | ||
| + | </ | ||
| + | |||
| + | Beispiel: '' | ||
| + | |||
| + | ==== Endpoint (API) ==== | ||
| + | Ein **API-Endpoint** ist eine Route, die als **Daten-Schnittstelle**((Schnittstelle = klar definierter „Zugang“: | ||
| + | Meistens liefert sie die Daten im **JSON**((JSON = Datenformat, | ||
| + | |||
| + | Beispiel: '' | ||
| + | |||
| + | |||
| + | |||
| + | ===== CRUD & HTTP-Methoden ===== | ||
| + | |||
| + | CRUD-Operationen werden bei Web-APIs typischerweise folgenden HTTP-Methoden zugeordnet: | ||
| + | |||
| + | ^ CRUD ^ HTTP-Methode ^ Typisches Beispiel einer Route ^ | ||
| + | | Create | ||
| + | | Read | **GET** | ||
| + | | Update | ||
| + | | Delete | ||
| + | |||
| + | Später werden Sie für Ihre eigenen Use Cases (Reisen, Filme, Bücher, …) genau solche Routen definieren, | ||
| + | z.B. '' | ||
| + | |||
| + | |||
| + | ===== Postman – unser „Frontend-Ersatz“ ===== | ||
| + | {{de: | ||
| + | |||
| + | Im Modul M290 programmieren wir **kein eigenes Browser-Frontend**. | ||
| + | Stattdessen benutzen wir **Postman** als Client: | ||
| + | |||
| + | * Postman kann '' | ||
| + | * Sie sehen direkt: | ||
| + | * den **Statuscode** (z.B. 200, 201, 400, 404, 500) ((Statuscode = Zahl, die beschreibt, ob die Anfrage erfolgreich war und warum/ | ||
| + | * die **Response-Header** ((Header = Zusatzinfos zur Antwort, z.B. Inhaltstyp oder Caching.)), | ||
| + | * den **Response-Body** (Text oder JSON). | ||
| + | * Sie können im Body bequem JSON eingeben (z.B. neuen '' | ||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | Postman können Sie hier downloaden → [[https:// | ||
| + | </ | ||
| + | |||
| + | {{de: | ||
| + | // | ||
| + | |||
| + | So können wir die API testen, als wäre schon ein fertiges Frontend vorhanden – nur viel einfacher und kontrollierter. | ||
| + | |||
| + | ===== Beispiel-API: | ||
| + | |||
| + | Wir verwenden als Beispiel eine vereinfachte '' | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | {{de: | ||
| + | |||
| + | ===== Express-Server mit Endpoints erstellen ===== | ||
| + | |||
| + | Wir erstellen einen Express-Server mit einer lokalen Liste von Posts (ohne Datenbank-Anbindung vorerst). | ||
| + | Danach bauen wir die ersten Routen: | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | <WRAP center round info 70%> | ||
| + | Wie in Projekten aus der Realität arbeiten wir hier mit // | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== 1. Start: Express-API für Posts ==== | ||
| + | |||
| + | Wir bauen auf dem bekannten Server-Setup aus LU15 auf. | ||
| + | |||
| + | <WRAP box round center 80%> | ||
| + | <code javascript> | ||
| + | import express from ' | ||
| + | |||
| + | const app = express(); | ||
| + | const port = 3000; | ||
| + | |||
| + | // Middleware: " | ||
| + | // express.json() liest den Request-Body und macht daraus req.body (JSON). | ||
| + | app.use(express.json()); | ||
| + | |||
| + | // " | ||
| + | let posts = [ | ||
| + | { | ||
| + | post_id: 1, | ||
| + | user_id: 1, | ||
| + | title: ' | ||
| + | image_url: ' | ||
| + | description: | ||
| + | likes: 10 | ||
| + | }, | ||
| + | { | ||
| + | post_id: 2, | ||
| + | user_id: 2, | ||
| + | title: ' | ||
| + | image_url: ' | ||
| + | description: | ||
| + | likes: 12 | ||
| + | } | ||
| + | ]; | ||
| + | |||
| + | // TEST-Route (UI/Info) | ||
| + | app.get('/', | ||
| + | res.send(' | ||
| + | }); | ||
| + | |||
| + | app.listen(port, | ||
| + | console.log(`API läuft auf http:// | ||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Wenn Sie diesen Server mit '' | ||
| + | |||
| + | |||
| + | ==== 2. READ – Alle Posts abfragen ==== | ||
| + | |||
| + | Jetzt fügen wir eine Route hinzu, die alle Posts zurückliefert: | ||
| + | |||
| + | <WRAP box round center 80%> | ||
| + | <code javascript> | ||
| + | // READ – alle Posts | ||
| + | app.get('/ | ||
| + | res.status(200).json(posts); | ||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === Test mit Postman oder Browser === | ||
| + | {{de: | ||
| + | |||
| + | * Methode: '' | ||
| + | * URL: '' | ||
| + | * Erwartung: | ||
| + | * Status '' | ||
| + | * JSON-Array mit den Beispiel-Posts | ||
| + | |||
| + | |||
| + | ==== 3. READ – Einzelnen Post nach ID abfragen ==== | ||
| + | |||
| + | Wir möchten einen einzelnen Post anhand der '' | ||
| + | |||
| + | <WRAP box round center 80%> <code javascript> | ||
| + | // READ – einzelner Post nach ID | ||
| + | app.get('/ | ||
| + | const id = Number(req.params.id); | ||
| + | const post = posts.find(p => p.post_id === id); | ||
| + | |||
| + | if (!post) { | ||
| + | return res.status(404).send(' | ||
| + | } | ||
| + | |||
| + | res.status(200).json(post); | ||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === Test mit Postman === | ||
| + | {{de: | ||
| + | |||
| + | * Methode: '' | ||
| + | * URL: '' | ||
| + | * Erwartung: | ||
| + | * Status '' | ||
| + | * JSON-Objekt mit '' | ||
| + | * URL: '' | ||
| + | * Status '' | ||
| + | * Body: '' | ||
| + | |||
| + | |||
| + | |||
| + | ==== 4. CREATE – Neuen Post anlegen ==== | ||
| + | |||
| + | Nun soll ein neuer Post erstellt werden. | ||
| + | Dazu schicken wir einen im Request einen " | ||
| + | |||
| + | <WRAP box round center 85%> | ||
| + | <code javascript> | ||
| + | app.post('/ | ||
| + | //Daten aus dem Anfrage-Objekt (Request) holen und in Variablen speichern | ||
| + | const user_id = req.body.user_id; | ||
| + | const title = req.body.title; | ||
| + | const image_url = req.body.image_url; | ||
| + | const description = req.body.description; | ||
| + | |||
| + | // ganz einfache Validierung (Pflichtfelder) - ohne titel oder user_id (wer post erstellt hat) können wir keinen neuen Post erstellen. | ||
| + | if (!title || !user_id) { | ||
| + | return res.status(400).send(' | ||
| + | } | ||
| + | |||
| + | // neue post_id berechnen - das wird in Zukunft die Datenbank selbst machen. | ||
| + | // Letzte Post-ID aus dem Post-Array herausfinden: | ||
| + | const lastPostId = posts[posts.length - 1].post_id; | ||
| + | const newPostId = lastPostId + 1; | ||
| + | |||
| + | const newPost = { | ||
| + | post_id: newPostId, | ||
| + | user_id: user_id, | ||
| + | title: title, | ||
| + | image_url: image_url || '', | ||
| + | description: | ||
| + | likes: 0 | ||
| + | }; | ||
| + | |||
| + | //neuer Post wird in Post-Array (Liste mit Posts) gespeichert | ||
| + | posts.push(newPost); | ||
| + | |||
| + | // | ||
| + | res.status(201).json(newPost); | ||
| + | |||
| + | |||
| + | }); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Erklärung ==== | ||
| + | |||
| + | Pflichtfelder: | ||
| + | |||
| + | Neue ID: Wir nehmen die '' | ||
| + | |||
| + | Antwort: '' | ||
| + | |||
| + | <WRAP center round info 80%> | ||
| + | Dieser Ansatz mit '' | ||
| + | * das Array mindestens 1 Element hat, und | ||
| + | * die Posts im Array nach '' | ||
| + | |||
| + | In echten Projekten übernimmt das später die Datenbank (AUTO_INCREMENT). | ||
| + | </ | ||
| + | |||
| + | === Test mit Postman === | ||
| + | |||
| + | {{de: | ||
| + | |||
| + | - Methode: '' | ||
| + | - URL: '' | ||
| + | - Tab '' | ||
| + | - Beispiel-Body: | ||
| + | <WRAP box round center 80%> | ||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | - '' | ||
| + | * Erwartung: | ||
| + | * Status '' | ||
| + | * JSON-Objekt mit neuer '' | ||
| + | - Anschliessend '' | ||
| + | |||
| + | |||
| + | ===== Ausblick ===== | ||
| + | |||
| + | Auf der nächsten Seite sind die HTTP-Methoden PUT und DELETE am gleichen Beispiel (Social-Media-Posts) ausgeführt. Sie werden diese auch für Ihr Projekt brauchen. | ||
| + | |||
| + | In der nächsten Unterrichtseinheit (LU17): | ||
| + | * ersetzen wir die JavaScript-Liste durch eine **MySQL-Tabelle '' | ||
| + | * bauen einfache **Validierung** und **Fehlerbehandlung** (HTTP-Statuscodes) ein, | ||
| + | * damit Sie diese Struktur für Ihren eigenen Projekt-Use-Case übernehmen können. | ||
| + | |||