Skip to content
IRC-CodingIRC-Coding
API DesignREST APIRessourcenorientierungIdempotenzVersionierungFehlerbehandlungPaginationHATEOAS

API Design Prinzipien: RESTful APIs planen, strukturieren und skalieren

Lerne die wichtigsten API Design Prinzipien: Ressourcenorientierung, Zustandslosigkeit, Idempotenz, Versionierung, Fehlerbehandlung, Pagination, Caching und Sicherheit für RESTful APIs.

S

schutzgeist

7 min read
API Design Prinzipien: RESTful APIs planen, strukturieren und skalieren

API Design Prinzipien

Gute API Design Prinzipien sorgen dafür, dass Schnittstellen verständlich, wartbar und skalierbar bleiben, sowohl für Entwickler als auch für automatisierte Clients.

Kompakte Beschreibung

API Design Prinzipien sind Leitlinien, die Du bei der Planung und Umsetzung von Schnittstellen befolgst, um konsistente, vorhersehbare und langfristig nutzbare APIs zu bauen. Im Mittelpunkt steht die Ressourcenorientierung, bei der Du Geschäftsobjekte wie Benutzer, Bestellungen oder Produkte als URLs modellierst und mit HTTP-Methoden darauf arbeitest. Eine gute API ist zustandslos, idempotent, versioniert und liefert eindeutige Fehlerantworten. Sie nutzt Pagination für große Datenmengen, Caching für Performance und klare Namenskonventionen für Lesbarkeit. Sicherheit, Dokumentation und Erweiterbarkeit werden von Anfang an berücksichtigt, nicht nachträglich hinzugefügt.

Ich arbeite derzeit extrem viel mit APIs, Z.B. für KI-Bots, KI-Chatoberflächen, oder um Dokumente wie Patente automatisch herunterzuladen und zu verarbeiten. Du wirst ein gutes API-Design lieben und sehr schnell unschöne Designs hassen.

Vielleicht fragst Du Dich, warum Du eine API-Schnittstelle programmieren solltest? Die Frage möchte ich Dir sehr kurz beantworten. “Für Deine eigenen Programme!”

Ja, ich programmiere viele Python-Tools und manchmal benötige ich diese in einem anderen Tool. Warum immer integrieren und den Code übernehmen, wenn ich darauf einfach per Schnittstelle zugreifen kann. So muss ich einen Bug auch nur an einer Stelle korrigieren.

Beispiel : Mein Fast-API-Framework benötigt einen Text-Cleaner und eine Dokumentenscript. Es war deutlich einfacher eine API zu erstellen, denn wenig später sind mir im Cleaner noch Fehler aufgefallen, die ich so nicht doppelt lösen musste.

Damit Du jedoch ordentliche API designst, gibt es ein paar gute Prinzipien/Regeln:

Wichtige Api-Design Komponenten

Ressourcenorientierung

Ressourcenorientierung bedeutet, dass Du Deine API um Geschäftsobjekte herum aufbaust. Statt Funktionen oder Aktionen zu exposen, definierst Du Ressourcen und nutzt HTTP-Methoden, um diese zu lesen, zu erstellen, zu ändern oder zu löschen. Ein Artikel wird beispielsweise über /articles/123 angesprochen, nicht über /getArticle?id=123. Das macht die API intuitiv und leicht zu merken.

Konsistente Namenskonventionen

Verwende durchgehend Kleinbuchstaben, Bindestriche oder Unterstriche und Pluralformen. URLs wie /order-items, /customers und /invoices/42/payments sind einfach lesbar und folgen einer klaren Hierarchie. Vermeide KamelCase, Abkürzungen und unterschiedliche Schreibweisen für ähnliche Konzepte.

Zustandslosigkeit

Jede Anfrage an die API muss alle Informationen enthalten, die der Server für die Verarbeitung benötigt. Der Server speichert keinen Sitzungszustand zwischen Anfragen. Authentifizierungsinformationen werden in jedem Request übertragen, beispielsweise im Authorization Header. Das macht die API skalierbar und fehlerresistent.

Verben durch HTTP-Methoden ausdrücken

Nutze GET, POST, PUT, PATCH und DELETE korrekt. GET ist für lesende Zugriffe, POST für das Erstellen neuer Ressourcen, PUT für vollständige Ersetzungen, PATCH für partielle Updates und DELETE für das Löschen. Vermeide Aktionen in URLs wie /articles/123/delete.

Idempotenz

Idempotente Operationen liefern bei wiederholtem Aufruf dasselbe Ergebnis. GET, PUT und DELETE sind idempotent, POST normalerweise nicht. Für nicht idempotente Operationen kannst Du Idempotency Keys verwenden, um versehentliche Doppelbuchungen zu vermeiden. Das ist besonders wichtig für Zahlungen, Bestellungen und Reservierungen.

Versionierung

APIs ändern sich über Zeit. Eine klare Versionierung, beispielsweise über den Pfad /v1/customers oder über Header, ermöglicht es Clients, die API weiterhin zu nutzen, während Du neue Features einführst. Vermeide inkompatible Änderungen in bestehenden Versionen.

Klare Fehlerbehandlung

Fehlerantworten sollten konsistente HTTP-Statuscodes und aussagekräftige Fehlernachrichten enthalten. Verwende beispielsweise 400 Bad Request für ungültige Eingaben, 404 Not Found für unbekannte Ressourcen und 409 Conflict für Konflikte. Strukturierte Fehlerobjekte nach RFC 7807 helfen Clients, Fehler automatisch zu verarbeiten.

Pagination

Liefere große Ergebnismengen nicht auf einmal aus. Verwende Pagination, entweder über Seitenzahlen, Offset und Limit oder Cursor-basiert. Cursor-Pagination ist bei sehr großen Datensätzen und Echtzeitdaten besser geeignet, weil sie keine Probleme mit verschobenen Ergebnissen hat.

HATEOAS

HATEOAS steht für Hypermedia as the Engine of Application State. Die Antwort einer API enthält dann Links zu verwandten Ressourcen und möglichen Aktionen. So kann ein Client die API weitgehend dynamisch erkunden, ohne hartcodierte URLs zu kennen.

Caching und Performance

Nutze HTTP-Header wie ETag, Last-Modified und Cache-Control, um wiederholte Anfragen zu reduzieren. Caching senkt die Serverlast und verbessert die Antwortzeiten. Für statische oder selten wechselnde Daten ist ein längerer Cache sinnvoll, für Echtzeitdaten eher ein kurzer oder keiner.

Sicherheit von Anfang an

Verwende HTTPS, authentifiziere und autorisiere Zugriffe, validiere Eingaben und setze Rate Limiting ein. Vermeide sensible Daten in URLs, protokolliere sicherheitsrelevante Ereignisse und achte auf OWASP-Empfehlungen für APIs.

Dokumentation und Contracts

Eine API ist nur so gut wie ihre Dokumentation. OpenAPI Specification ermöglicht es Dir, die API maschinenlesbar zu beschreiben, Beispiele zu hinterlegen und Tests sowie Codegenerierung zu unterstützen.

Praxisbeispiel

Stell Dir einen Online-Shop vor, der Artikel, Kunden und Bestellungen verwaltet. Die API könnte folgende Ressourcen anbieten:

GET    /api/v1/products              Liste aller Produkte mit Pagination
GET    /api/v1/products/42           Detailansicht eines Produkts
POST   /api/v1/orders                Neue Bestellung anlegen
PUT    /api/v1/orders/123            Bestellung vollständig ersetzen
PATCH  /api/v1/orders/123/status     Bestellstatus aktualisieren
DELETE /api/v1/orders/123             Bestellung löschen
GET    /api/v1/orders/123/items      Positionen einer Bestellung

Eine POST-Anfrage für eine neue Bestellung könnte so aussehen:

POST /api/v1/orders
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Idempotency-Key: 9f8e7d6c-5b4a-3210-9f8e-7d6c5b4a3210

{
  "customerId": 123,
  "items": [
    { "productId": 42, "quantity": 2 },
    { "productId": 7, "quantity": 1 }
  ],
  "shippingAddress": {
    "street": "Musterstraße 12",
    "city": "Berlin",
    "zip": "10115"
  }
}

Die Antwort bei erfolgreicher Erstellung:

HTTP/1.1 201 Created
Location: /api/v1/orders/98765
Content-Type: application/json

{
  "orderId": 98765,
  "status": "created",
  "total": 79.97,
  "links": {
    "self": "/api/v1/orders/98765",
    "items": "/api/v1/orders/98765/items",
    "cancel": "/api/v1/orders/98765/cancel"
  }
}

FAQ: API Design Prinzipien

1. Was bedeutet ressourcenorientiertes API Design?

Ressourcenorientiertes API Design bedeutet, dass Du Deine Schnittstelle um konkrete Geschäftsobjekte herum aufbaust. Jede Ressource hat eine eindeutige URL, und HTTP-Methoden definieren die Aktionen auf dieser Ressource.

2. Warum sollte eine API zustandslos sein?

Eine zustandslose API speichert keine Sitzungsinformationen auf dem Server. Jede Anfrage enthält alle nötigen Daten. Das erleichtert Skalierung, Lastverteilung und Fehlerbehebung, weil jeder Request unabhängig ist.

3. Was ist Idempotenz und warum ist sie wichtig?

Idempotenz bedeutet, dass mehrfache identische Anfragen dasselbe Ergebnis liefern. Sie ist wichtig, um Netzwerkprobleme und Wiederholungen sicher zu behandeln, beispielsweise bei Zahlungen oder Bestellungen.

4. Welche HTTP-Methoden sollten in einer REST API verwendet werden?

GET liest Daten, POST erstellt Ressourcen, PUT ersetzt Ressourcen vollständig, PATCH aktualisiert Ressourcen partiell und DELETE entfernt Ressourcen. Diese Semantik sollte konsistent eingehalten werden.

5. Wie versioniert man eine API sinnvoll?

Die gebräuchlichste Variante ist die Versionierung im Pfad, beispielsweise /v1/customers. Alternativ kannst Du Versionen über Header oder Content Negotiation steuern. Wichtig ist, dass inkompatible Änderungen in neuen Versionen eingeführt werden.

6. Was ist HATEOAS?

HATEOAS ist ein Prinzip, bei dem API-Antworten Links zu verwandten Ressourcen und Aktionen enthalten. Der Client kann so die API dynamisch erkunden und muss weniger URLs hartcodieren.

7. Warum ist Pagination wichtig?

Pagination verhindert, dass große Ergebnismengen auf einmal übertragen werden. Das reduziert die Ladezeit, die Serverlast und das Speichervolumen auf dem Client. Ohne Pagination können Listen mit Tausenden Einträgen die API unbrauchbar machen.

8. Was sind Problem Details?

Problem Details sind standardisierte Fehlerformate nach RFC 7807. Sie enthalten Felder wie type, title, status, detail und instance. Clients können Fehler so einheitlich auswerten und dem Nutzer hilfreiche Meldungen anzeigen.

9. Was ist der Unterschied zwischen PUT und PATCH?

PUT ersetzt eine Ressource vollständig durch die gesendete Darstellung. PATCH führt nur eine partielle Änderung durch. Wenn Du nur den Status einer Bestellung ändern möchtest, verwendest Du PATCH, nicht PUT.

10. Wie sollten URLs in einer REST API aufgebaut sein?

URLs sollten hierarchisch, lesbar und konsistent sein. Verwende Pluralformen, Bindestriche und Kleinbuchstaben. Beispiele sind /orders, /orders/123/items oder /customers/42/addresses.

11. Was ist ein Idempotency Key?

Ein Idempotency Key ist ein eindeutiger Wert, den der Client bei nicht idempotenten Anfragen mitgibt. Der Server verwendet diesen Schlüssel, um Doppelausführungen zu erkennen und nur einmal zu verarbeiten.

12. Warum ist HTTPS für APIs Pflicht?

HTTPS verschlüsselt die Datenübertragung und schützt vor Abhörung und Manipulation. Moderne APIs übertragen Authentifizierungstoken und sensible Daten. Ohne HTTPS ist die API nicht sicher betreibbar.

13. Was ist Content Negotiation?

Content Negotiation ermöglicht es Client und Server, das Datenformat und die Sprache der Antwort auszuhandeln. Über den Accept Header teilt der Client mit, welche Formate er versteht, beispielsweise application/json oder application/xml.

14. Was ist API Rate Limiting?

Rate Limiting begrenzt die Anzahl der Anfragen, die ein Client in einem bestimmten Zeitraum stellen darf. Es schützt vor Überlastung, Missbrauch und DDoS-Angriffen. Clients erhalten Informationen über ihre Limits über Header wie X-RateLimit-Remaining.

15. Warum ist API Dokumentation wichtig?

Gute Dokumentation ermöglicht es Entwicklern, die API schnell zu verstehen und korrekt zu nutzen. Sie reduziert Supportanfragen, verhindert Fehler und erleichtert die Integration. OpenAPI ist ein gängiges Format für maschinenlesbare Dokumentation.

Weiter im API Lernpfad

Der nächste Artikel im API Lernpfad behandelt API-First-Design-Prinzipien — warum die API-Spezifikation vor der Implementierung stehen sollte und wie API-Driven Development funktioniert.

Quellen

  1. https://www.rfc-editor.org/rfc/rfc9110
  2. https://www.rfc-editor.org/rfc/rfc7807
  3. https://swagger.io/specification/
  4. https://developer.mozilla.org/docs/Web/API

Buchempfehlungen zur API-Entwicklung

Wenn Du Dich weiter mit API Design, REST und Softwarearchitektur beschäftigen möchtest, empfehlen wir Dir die folgenden Bücher:

API-Entwicklung

Bücher über API-Design, REST, GraphQL, OpenAPI und API-Architektur

REST und HTTP: Entwicklung und Integration nach REST-Prinzipien von Stefan Tilkov

REST und HTTP: Entwicklung und Integration nach REST-Prinzipien von Stefan Tilkov

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

API-Design: Praxishandbuch für Java- und Webservice-Entwickler

API-Design: Praxishandbuch für Java- und Webservice-Entwickler

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Microservices: Grundlagen flexibler Softwarearchitekturen von Eberhard Wolff

Microservices: Grundlagen flexibler Softwarearchitekturen von Eberhard Wolff

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Zurück zum DEV Blog
Share:

Ähnliche Beiträge