API-Design: Schnittstellen entwerfen, die Änderungen überstehen
API-Design-Grundlagen: wie klare Verträge, einheitliche Fehler, geplante Abwärtskompatibilität und gepflegte Dokumentation langlebige Schnittstellen ermöglichen.
Fachlicher Entwurf
Dieser Artikel ist fachlich ausgearbeitet, aber noch nicht durch OSSDL freigegeben. Inhalte können sich nach der Prüfung ändern.
Warum gutes API-Design langfristig wichtig ist
Eine Programmierschnittstelle, kurz API, verbindet Softwarekomponenten. Sie legt fest, welche Funktionen oder Daten andere Systeme ansprechen können und wie diese Aufrufe aussehen. Sobald mehrere Anwendungen, Teams oder externe Nutzerinnen und Nutzer davon abhängen, wird die Schnittstelle zu einem Vertrag: Änderungen auf einer Seite können Auswirkungen auf alle anderen haben.
Ein durchdachtes API-Design macht diesen Vertrag verständlich und möglichst stabil. Es verhindert nicht jede Anpassung. Es hilft aber, Anforderungen klar zu formulieren, unerwartete Abhängigkeiten zu vermeiden und Änderungen planbar umzusetzen. Die wichtigsten API-Design-Grundlagen betreffen deshalb nicht nur die Benennung von Endpunkten. Sie reichen von der Zielgruppe und dem fachlichen Modell bis zum Umgang mit Fehlern und Weiterentwicklungen. Weitere Beiträge zu Architektur und Codequalität finden Sie in der Rubrik Software Engineering.
Anforderungen und Nutzer der API klären
Bevor Endpunkte oder Datenstrukturen entworfen werden, sollte feststehen, wer die API verwendet und welches Problem sie löst. Eine interne Schnittstelle für wenige Dienste kann andere Schwerpunkte haben als eine öffentliche API für viele unabhängige Anwendungen. Entscheidend ist, die tatsächlichen Nutzungsszenarien zu verstehen, statt vorschnell einzelne Funktionen abzubilden.
Hilfreiche Fragen am Anfang sind:
- Welche Aufgaben sollen Nutzerinnen und Nutzer mit der API erledigen?
- Welche Informationen benötigen sie dafür?
- Welche Abläufe sind häufig, welche selten?
- Welche Einschränkungen gelten für Zugriffsrechte und Daten?
- Welche bestehenden Systeme oder Verträge müssen berücksichtigt werden?
Die Antworten bestimmen, wie groß und spezialisiert eine API sein sollte. Eine Schnittstelle, die jeden internen Vorgang einzeln nach außen abbildet, kann schwer verständlich werden. Umgekehrt erschwert eine zu grobe API bestimmte Abläufe, wenn Nutzerinnen und Nutzer viele Einzelaufrufe kombinieren müssen.
Fachliche Begriffe statt interner Details verwenden
Eine API sollte das fachliche Modell der Anwendung nachvollziehbar ausdrücken. Namen für Ressourcen, Felder und Operationen sollten Begriffe verwenden, die im jeweiligen Arbeitsbereich eindeutig sind. Interne Klassenbezeichnungen oder Datenbankspalten sind dafür nicht automatisch geeignet: Sie können sich ändern, obwohl der fachliche Vertrag gleich bleibt.
Konsistente Benennung hilft ebenso. Wenn ein Begriff an verschiedenen Stellen unterschiedliche Bedeutungen hat, müssen Nutzende raten. Werden gleichartige Konzepte nach verschiedenen Mustern benannt, steigt der Aufwand bei der Einarbeitung und bei der Wartung von Clients. Ein gemeinsames Glossar oder kurze Namensregeln können solche Unklarheiten früh sichtbar machen.
Auch die Form der Schnittstelle sollte zur Aufgabe passen. Bei einer ressourcenorientierten API stehen meist fachliche Objekte und ihre Beziehungen im Mittelpunkt. Bei einer auf Aktionen ausgerichteten API können klar benannte Operationen verständlicher sein. Entscheidend ist nicht, einem Stil um jeden Preis zu folgen, sondern ein einheitliches Modell zu wählen und konsequent anzuwenden.
Ressourcen und Operationen sinnvoll zuschneiden
Jede Ressource sollte einen erkennbaren fachlichen Zweck haben. Zu viele kleinteilige Ressourcen führen zu einer Vielzahl von Aufrufen für einfache Arbeitsabläufe. Zu umfassende Ressourcen bündeln dagegen womöglich unabhängige Zuständigkeiten und machen Änderungen unübersichtlich.
Operationen sollten die Absicht eines Aufrufs erkennen lassen. Namen und Eingaben müssen vermitteln, welche Wirkung zu erwarten ist. Besonders wichtig ist, zwischen dem Lesen von Daten und einer Veränderung zu unterscheiden. Ein Aufruf, der scheinbar nur Informationen abruft, sollte nicht nebenbei einen fachlichen Zustand ändern.
Ein konsistentes API-Design für Eingaben und Antworten
Ein API-Vertrag ist leichter zu nutzen, wenn vergleichbare Vorgänge ähnlich aufgebaut sind. Das betrifft etwa die Struktur von Antworten, die Darstellung von Sammlungen, die Benennung von Feldern und die Behandlung optionaler Werte. Einheitlichkeit muss nicht bedeuten, dass jede Antwort gleich aussieht. Sie sollte aber vermeiden, dass für dieselbe Art von Information ohne fachlichen Grund unterschiedliche Regeln gelten.
Bei Eingaben sollte klar sein, welche Felder erforderlich sind, welche weggelassen werden dürfen und was bei ungültigen Werten geschieht. Mehrdeutige Regeln führen dazu, dass verschiedene Clients dasselbe Verhalten unterschiedlich interpretieren. Auch Standardwerte sollten nicht überraschend angewendet werden. Falls ein fehlender Wert eine fachliche Bedeutung hat, muss diese Bedeutung dokumentiert sein.
Antworten sollten nur Informationen enthalten, die für den Vertrag relevant sind. Werden interne Details unnötig offengelegt, können spätere Änderungen daran erschwert werden. Gleichzeitig sollte eine Antwort genügend Kontext bieten, damit Nutzende das Ergebnis verstehen und damit weiterarbeiten können. Dazu gehören je nach Aufgabe auch Kennzeichnungen für leere Ergebnisse oder Hinweise auf weitere verfügbare Daten.
Fehler verständlich und einheitlich darstellen
Fehler gehören zum normalen Verhalten einer Schnittstelle. Ein Aufruf kann beispielsweise unvollständige Eingaben enthalten, an fehlenden Berechtigungen scheitern oder auf eine nicht verfügbare Ressource verweisen. Eine gute Fehlerantwort macht verständlich, was fehlgeschlagen ist und welche Art von Problem vorliegt, ohne interne Implementierungsdetails preiszugeben.
Fehler sollten nach klaren, konsistenten Regeln unterschieden werden. Allgemeine Meldungen wie „Fehler aufgetreten“ helfen kaum bei der Behebung. Eine knappe Beschreibung und ein stabiler Fehlercode können dagegen automatisierte Reaktionen ermöglichen. Sensible Informationen wie interne Pfade, Zugangsdaten oder ungefilterte technische Ausnahmen gehören nicht in Antworten an API-Nutzende.
Änderungen planen, bevor sie nötig werden
Schnittstellen verändern sich, weil sich fachliche Anforderungen und technische Rahmenbedingungen weiterentwickeln. Für ein belastbares API-Design ist deshalb nicht nur der aktuelle Zustand wichtig. Ebenso zählt, wie kompatible Ergänzungen, veraltete Funktionen und grundlegende Änderungen behandelt werden.
Rückwärtskompatible Änderungen lassen bestehende Clients in der Regel weiterarbeiten. Dazu können zusätzliche optionale Felder oder neue Funktionen gehören, sofern der bestehende Vertrag dadurch nicht anders ausgelegt werden muss. Änderungen an Pflichtfeldern, Bedeutungen oder Antwortformaten können dagegen vorhandene Clients beeinträchtigen. Vor jeder Anpassung sollte daher geprüft werden, welche Abhängigkeiten betroffen sein könnten.
Wenn eine inkompatible Änderung unvermeidbar ist, hilft ein geordneter Übergang. Dazu gehören eine klare Kennzeichnung der alten Funktion, eine nachvollziehbare Beschreibung der Alternative und ausreichend Information für betroffene Nutzerinnen und Nutzer. Für größere Änderungen kann eine neue Schnittstellenversion sinnvoll sein. Eine Versionsnummer allein löst jedoch keine Kompatibilitätsprobleme: Entscheidend bleiben klare Regeln dafür, welche Verträge in welcher Version gelten.
Erweiterbarkeit nicht mit Beliebigkeit verwechseln
Es kann verlockend sein, vorsorglich zahlreiche Optionen und Erweiterungspunkte einzubauen. Das macht eine API jedoch nicht automatisch zukunftsfähig. Unklare Felder und generische Parameter erhöhen die Komplexität, bevor ihr Nutzen feststeht. Besser ist ein klarer, kleiner Vertrag, der konkrete Anforderungen erfüllt und Erweiterungen ermöglicht, ohne heutiges Verhalten mehrdeutig zu machen.
Dazu gehört auch, stabile von veränderlichen Teilen zu trennen. Interne Abläufe sollten sich ändern können, ohne dass jede Anpassung nach außen sichtbar wird. Die Schnittstelle sollte nur jene Details festlegen, auf die Nutzerinnen und Nutzer tatsächlich angewiesen sind. Je weniger unnötige Implementierungsentscheidungen Teil des Vertrags sind, desto größer bleibt der Spielraum für Weiterentwicklung. Wo die Schnittstellen zwischen Modulen oder Diensten verlaufen, hängt eng mit der Entscheidung zwischen modularem Monolithen und Microservices zusammen.
Dokumentation als Teil des Vertrags behandeln
Eine API-Dokumentation ist keine nachträgliche Ergänzung. Sie erklärt, wie ein Vertrag zu verstehen ist. Dazu zählen verfügbare Operationen, Eingaben, Antworten, mögliche Fehler und Voraussetzungen für die Nutzung. Unklare oder veraltete Dokumentation kann selbst eine gut strukturierte Schnittstelle schwer nutzbar machen.
Beschreibungen sollten konkrete Fragen beantworten: Was bewirkt ein Aufruf? Welche Felder sind erforderlich? Was bedeutet ein leerer Wert? Welche Fehler können auftreten? Welche Einschränkungen gelten? Beispiele können Abläufe veranschaulichen, sollten aber dem tatsächlichen Vertrag entsprechen und keine Sonderfälle als allgemeine Regel darstellen.
Dokumentation und Implementierung müssen gemeinsam weiterentwickelt werden. Wird der Vertrag geändert, müssen zugehörige Beschreibungen ebenfalls angepasst werden. Eine fachliche Prüfung vor der Veröffentlichung kann helfen, widersprüchliche Definitionen und missverständliche Begriffe aufzudecken. Wichtig ist, dass die Dokumentation nicht nur für das Team verständlich ist, das die API entwickelt, sondern auch für ihre vorgesehenen Nutzerinnen und Nutzer.
Sicherheit und klare Zugriffsgrenzen berücksichtigen
Eine API sollte nur die Daten und Aktionen zugänglich machen, die für ihren Zweck notwendig sind. Zugriffsrechte müssen auf fachlicher Ebene nachvollziehbar sein: Wer darf welche Ressource lesen oder verändern? Werden diese Grenzen erst spät berücksichtigt, können sie schwer mit dem übrigen Schnittstellendesign zusammenpassen.
Auch Eingaben verdienen Aufmerksamkeit. Die Schnittstelle sollte festlegen, welche Werte zulässig sind und wie unerwartete Eingaben behandelt werden. Fehlerantworten dürfen dabei keine vertraulichen Informationen offenlegen. Für konkrete Sicherheitsanforderungen sind die Einsatzumgebung und die Art der verarbeiteten Daten maßgeblich; bei sensiblen Anwendungen sollte die Ausgestaltung fachlich und sicherheitstechnisch geprüft werden.
API-Design-Grundlagen im Entwicklungsalltag verankern
Die Qualität einer API hängt nicht an einer einzelnen Entwurfsentscheidung. Sie entsteht durch wiederkehrende Abstimmung zwischen den Personen, die Anforderungen definieren, die Schnittstelle implementieren und sie verwenden. Ein gemeinsamer Blick auf Beispiele und typische Aufrufe macht Unklarheiten oft früher sichtbar als eine Diskussion über abstrakte Namensregeln.
Vor der Freigabe helfen Fragen wie diese:
- Sind Zweck und Zielgruppe der Schnittstelle eindeutig?
- Werden fachliche Begriffe konsequent verwendet?
- Sind Eingaben, Antworten und Fehler verständlich beschrieben?
- Ist erkennbar, welche Änderungen bestehende Clients beeinflussen könnten?
- Sind Zugriffsrechte und sensible Informationen berücksichtigt?
Solche Fragen ersetzen keine detaillierte technische Prüfung. Sie geben Teams aber eine gemeinsame Grundlage, um Entscheidungen zu begründen und Widersprüche aufzudecken. Ein Review des API-Vertrags mit späteren Nutzenden kann zusätzlich zeigen, ob die Schnittstelle aus ihrer Perspektive verständlich ist. Unklare Verträge, die über Jahre bestehen bleiben, können sich zu technischen Schulden auswachsen. Einen Überblick über Leistungen zum Schnittstellen- und API-Design gibt die Seite Softwarearchitektur.
Häufige Fragen zum API-Design
Sollte eine API die Datenbankstruktur direkt abbilden?
In der Regel sollte der API-Vertrag fachliche Informationen ausdrücken und nicht an interne Tabellen oder Spalten gebunden sein. Eine direkte Kopplung kann dazu führen, dass Änderungen an der Datenspeicherung unerwartete Anpassungen für API-Nutzende erzwingen. Welche Abstraktion sinnvoll ist, hängt jedoch vom Einsatzzweck und den fachlichen Anforderungen ab.
Wann sollte eine veraltete Funktion aus einer API entfernt werden?
Eine Funktion sollte erst entfernt werden, wenn ihre Nutzung und die Auswirkungen auf bestehende Clients ausreichend geklärt sind. Eine Vorankündigung und eine verständliche Alternative erleichtern den Übergang. Bei Anwendungen mit besonderen Verfügbarkeits- oder Vertragsanforderungen sollten die zuständigen Fachleute die konkreten Fristen und Pflichten klären.
Muss jede API öffentlich dokumentiert sein?
Nein. Der Umfang und die Zugänglichkeit der Dokumentation richten sich nach der Zielgruppe und dem Schutzbedarf der Schnittstelle. Auch bei rein interner Nutzung ist eine verlässliche Beschreibung hilfreich, damit Teams denselben Vertrag verwenden und Änderungen nachvollziehen können.
Fazit
Ein langlebiges API-Design beginnt mit klaren Anforderungen und einem verständlichen fachlichen Modell. Konsistente Eingaben, aussagekräftige Fehler, sorgfältig geplante Änderungen und aktuelle Dokumentation machen Schnittstellen verlässlicher. Wer den API-Vertrag aus Sicht seiner Nutzerinnen und Nutzer gestaltet, schafft Raum für technische Weiterentwicklung, ohne bestehende Clients unnötig zu beeinträchtigen.
Passende Leistung