REST-API bauen: Design, Sicherheit und Deployment
Um eine REST-API zu bauen, listest du die Ressourcen auf, die deine App verwaltet (Benutzer, Bestellungen, Buchungen), gibst jeder eine URL wie /orders und /orders/{id} und nutzt HTTP-Methoden für Aktionen: GET zum Lesen, POST zum Anlegen, PATCH zum Ändern, DELETE zum Entfernen. Gib JSON mit aussagekräftigen Statuscodes zurück, validiere jede Eingabe, verlange Authentifizierung und Berechtigungsprüfungen pro Datensatz auf dem Server und teile Listen in Seiten auf. Dokumentiere danach die Endpunkte und stelle die API hinter HTTPS bereit.
Dieser Leitfaden behandelt die Designentscheidungen, eine Auswahl fertiger Routen, Prompts für einen KI-App-Builder und die Fehler, die zu Sicherheitslücken führen. Wenn APIs für dich neu sind, beginne mit was eine API ist.
Wann du eine REST-API brauchst
- Dein Web-Frontend muss Daten auf einem Server speichern und laden
- Eine Mobile-App, ein Partner oder ein Automatisierungstool braucht Zugriff auf deine Daten
- Andere Dienste senden dir Ereignisse (Webhooks)
- Du teilst die Arbeit zwischen einem Frontend- und einem Backend-Team auf
REST ist der häufigste Stil, aber nicht der einzige. REST vs. GraphQL erklärt, wann ein flexibler Abfrage-Endpunkt besser passt.
Zuerst designen: Ressourcen und Routen
Schreib die Substantive deiner App und das, was Nutzer mit ihnen tun, auf. Für eine einfache Buchungs-App sieht das so aus:
| Methode | Route | Was sie tut | Erfolgscode |
|---|---|---|---|
GET | /api/bookings | Buchungen des Aufrufers auflisten (paginiert) | 200 |
POST | /api/bookings | Buchung anlegen | 201 |
GET | /api/bookings/{id} | Eine Buchung abrufen | 200 |
PATCH | /api/bookings/{id} | Einige Felder ändern | 200 |
DELETE | /api/bookings/{id} | Buchung stornieren | 204 |
GET | /api/health | Health-Check für das Monitoring | 200 |
Diese Routen bilden Anlegen, Lesen, Ändern und Löschen ab; siehe was CRUD ist. Konventionen, die sich lohnen:
- Substantive im Plural, keine Verben in URLs:
/bookings, nicht/getBookings. - Nur eine Ebene verschachteln, wenn es die Zugehörigkeit klarer macht:
/bookings/{id}/notes. - Aktionen, die kein CRUD sind, können Unterressourcen sein:
POST /bookings/{id}/cancelist klarer als ein unklares PATCH. - Einheitliche Feldnamen, zum Beispiel
created_atüberall.
Statuscodes und Fehler
Nutze die Standard-HTTP-Codes, damit Clients erkennen, was passiert ist, ohne Text zu parsen:
| Code | Bedeutung | Verwenden, wenn |
|---|---|---|
| 200 | OK | Erfolgreiches Lesen oder Ändern |
| 201 | Created | Ein POST hat etwas angelegt |
| 204 | No Content | Erfolg ohne Rückgabe |
| 400 | Bad Request | Eingabe hat die Validierung nicht bestanden |
| 401 | Unauthorized | Nicht angemeldet oder ungültiger Token |
| 403 | Forbidden | Angemeldet, aber nicht berechtigt |
| 404 | Not Found | Existiert nicht, oder der Aufrufer darf nicht wissen, dass er existiert |
| 409 | Conflict | Doppelt, oder der Termin ist schon belegt |
| 429 | Too Many Requests | Rate Limit erreicht |
| 500 | Server Error | Auf deiner Seite ist etwas kaputtgegangen |
Gib Fehler in einer einheitlichen JSON-Struktur zurück, zum Beispiel {"error": {"code": "slot_taken", "message": "Dieser Termin ist nicht mehr verfügbar."}}, und gib in Antworten niemals Stack-Traces oder Datenbankfehler aus.
Optionen und Abwägungen
| Entscheidung | Einfache Wahl | Alternative |
|---|---|---|
| Wo die API liegt | API-Routen in deinem Web-Framework | Ein eigener API-Dienst, nützlich für mehrere Clients oder eine andere Sprache |
| Authentifizierung | Session-Cookies für deine eigene Web-App | Tokens (Bearer-Tokens oder API-Keys) für Mobile-Apps und Dritte |
| Pagination | ?page=2&limit=20 | Cursor-basiert (?after=...), stabiler bei großen, sich ändernden Listen |
| Versionierung | Keine, bis externe Nutzer dich brauchen | /v1/ im Pfad, sobald andere davon abhängen |
| Doku | Eine README mit Routen | Eine OpenAPI-Spezifikation, aus der Tools interaktive Doku und Client-Code erzeugen |
Schritt für Schritt
- Ressourcen und Routen auflisten, wie oben, inklusive wer jede Route aufrufen darf.
- Die Daten modellieren in deiner Datenbank mit den Feldern und Beziehungen, die du brauchst.
- Zuerst die Lese-Routen bauen, dann Anlegen, Ändern und Löschen.
- Jede Eingabe bei Schreibzugriffen validieren mit einer Schema-Bibliothek: Pflichtfelder, Typen, Längen, erlaubte Werte. Unbekannte Felder ablehnen.
- Authentifizierung hinzufügen, dann Autorisierung pro Datensatz: Das Laden von
/bookings/42muss prüfen, dass Buchung 42 dem Aufrufer gehört, nicht nur, dass jemand angemeldet ist. - Jede Liste paginieren und die Seitengröße begrenzen.
- Login und aufwendige Routen ratenbegrenzen. Siehe Rate Limiting.
- CORS nur konfigurieren, wenn Browser auf anderen Domains die API aufrufen müssen, und diese Ursprünge explizit auflisten. CORS-Fehler beheben erklärt die Fehler, die du sehen wirst.
- Doku und Tests schreiben für jede Route, inklusive der Fehlerfälle.
- Deployen mit Geheimnissen in Umgebungsvariablen, HTTPS, Logs und einem Health-Check.
Prompts für deinen KI-Builder
Gerüst:
Erstelle eine REST-API für Buchungen mit diesen Routen: GET /api/health, GET /api/bookings (paginiert, maximal 50 pro Seite), POST /api/bookings, GET /api/bookings/:id, PATCH /api/bookings/:id, DELETE /api/bookings/:id. Speichere die Daten in unserer Datenbank. Validiere Request-Bodies mit einer Schema-Bibliothek und lehne unbekannte Felder ab. Gib JSON-Fehler als {"error": {"code", "message"}} mit passenden Statuscodes (400, 401, 403, 404, 409) zurück. Halte Geheimnisse in Umgebungsvariablen.
Sicherheit:
Verlange eine Anmeldung für jede Buchungsroute. Prüfe bei jedem Lesen, Ändern und Löschen auf dem Server, dass die Buchung dem aktuellen Nutzer gehört; gib 404 zurück, wenn nicht. Akzeptiere niemals Nutzer-IDs oder Rollen aus dem Request-Body. Begrenze POST /api/bookings auf 20 Anfragen pro Minute und Nutzer. Logge Fehler auf dem Server, ohne Stack-Traces zurückzugeben.
Doku:
Schreibe eine OpenAPI-Beschreibung dieser Routen und eine kurze README mit Beispiel-Requests und -Antworten für jede Route.
Deine API testen
Teste von außerhalb des Frontends, denn Angreifer werden das tun:
- Jede Route funktioniert mit gültiger Eingabe und liefert die dokumentierte Struktur und den dokumentierten Code
- Fehlende oder ungültige Felder liefern 400 mit einer klaren Meldung
- Ohne Token liefert jede geschützte Route 401
- Nutzer A, der per ID den Datensatz von Nutzer B abruft, erhält 404 oder 403
- Listen sind paginiert; ein riesiges
limitwird begrenzt - Doppelte oder kollidierende Anlagen liefern 409, nicht 500
- Rate Limits liefern 429
- Fehlerantworten enthalten keine Stack-Traces, kein SQL und keine Geheimnisse
- CORS erlaubt nur die Ursprünge, die du vorgesehen hast
Häufige Fehler
- Anmeldung prüfen, aber nicht die Zugehörigkeit. Die häufigste API-Lücke: Jeder angemeldete Nutzer kann jeden Datensatz lesen, indem er die ID ändert.
- Dem Client vertrauen. Preise, Rollen und Nutzer-IDs aus dem Request-Body können verändert werden.
- Ganze Datenbankzeilen zurückgeben. Passwort-Hashes und interne Felder leaken. Lege fest, was jede Antwort enthält.
- Unbegrenzte Listen. Eine Anfrage für alle Datensätze kann die ganze App verlangsamen.
200 OKmit einer Fehlermeldung im Inneren. Clients und Monitoring können nicht erkennen, dass etwas fehlgeschlagen ist.- CORS, das alles erlaubt, bei einer API, die Cookies nutzt.
- Kein Health-Check und keine Logs, sodass du von Ausfällen durch Nutzer erfährst.
Für einen umfassenderen Check vor dem Start siehe die Sicherheitscheckliste für KI-gebaute Apps.
Eine REST-API in Mythex bauen
Du kannst Mythex um eine API bitten, als Teil deiner App oder als eigenen Dienst. Das Docs-Rezept REST-API-Backend enthält einen Start-Prompt: Nenne dein Framework und deine Routen, bitte um klare JSON-Fehler, halte Geheimnisse in Umgebungsvariablen und lass ein Dockerfile erstellen. Container-Backends in Node, Python, C#, Java und anderen werden über ein Dockerfile veröffentlicht, und Mythex übernimmt das Deployment über Publish (API-Backends). Ein Projekt kann eine Website und einen API-Server nebeneinander betreiben, und du kannst in der Vorschau zwischen beiden wechseln. Speichere Schlüssel als Projekt-Secrets, und wenn die API eine Datenbank braucht, bitte im Chat darum. Für geplante Hintergrundaufgaben rund um deine API siehe wie du Hintergrundjobs ausführst.
Fragen
Was ist eine REST-API?
Eine REST-API ist eine Möglichkeit, dass Programme über HTTP mit den Daten deiner App arbeiten. Jede Art von Daten ist eine Ressource mit eigener URL, zum Beispiel /orders, und Standardmethoden wirken darauf: GET zum Lesen, POST zum Anlegen, PATCH oder PUT zum Ändern und DELETE zum Entfernen. Die Daten werden meist als JSON übertragen.
In welcher Sprache sollte ich eine REST-API bauen?
Nimm, was du oder dein Team pflegen könnt. Node.js mit Express oder Fastify, Python mit FastAPI sowie Frameworks für C# oder Java funktionieren alle gut. Die Designregeln für Routen, Statuscodes, Validierung und Authentifizierung sind wichtiger als die Sprache.
Wie sichere ich eine REST-API ab?
Verlange eine Anmeldung für jede nicht öffentliche Route, prüfe auf dem Server, ob der Aufrufer auf genau diesen Datensatz zugreifen darf, validiere alle Eingaben, nutze HTTPS, begrenze die Anzahl der Anfragen und bewahre Geheimnisse in Umgebungsvariablen auf. Vertraue niemals IDs oder Rollen, die der Client schickt.
Brauche ich ein separates Backend für eine REST-API?
Nicht immer. Frameworks wie Next.js können API-Routen neben Seiten ausliefern. Ein eigener API-Dienst lohnt sich, wenn mehrere Clients (Web, Mobile, Partner) ihn nutzen oder er eine eigene Sprache oder Skalierung braucht.