Beispiele sind der programmatische Zugriff auf OpenGPT-X-Modelle und die Integration von Google Maps oder OpenWeather-Maps in eigene Anwendungen. Weil Sicherheit eine wichtige Rolle spielt, stellen die Anbieter von kostenlosen oder kostenpflichtigen Diensten meist API-Tokens zur Verfügung, gewissermaßen als Schlüssel, um den Dienstzugriff abzusichern und natürlich, um Zugriffskosten abzurechnen.
Doch was zeichnet eigentlich gute APIs aus? Mit den oben genannten Werkzeugen müssen Entwickler schließlich sorgsam und systematisch umgehen, wenn sie ein gutes Design schaffen wollen.
Nutzbarkeit: Eine API sollte für Entwickler leicht, logisch und intuitiv erfassbar und nachvollziehbar sein. Notwendig sind für einen schnellen Einstieg geeignete Beispiele, Tutorien und Dokumentationen. Natürlich sollten die Beispiele über praxisferne Spielanwendungen hinausgehen, ohne den Entwickler mit Komplexität zu erschlagen. Das Einfache oder Offensichtliche muss leicht zu bewerkstelligen sein, das Komplexe umsetzbar. Im Optimalfall ist eine API problemraumorientiert entworfen.
Dokumentation: Ist sie leicht verständlich, klar und aktuell, schafft sie eine ideale Basis. Dazu gehört die Dokumentation aller Funktionen inklusive ihrer erwarteten Parameter, der zurückgelieferten Ergebnisse und möglicher Fehler. Ebenfalls wichtig sind die leichte Auffindbarkeit der Dokumente und ihre Navigierbarkeit.
Konsistenz: Die verwendete Benennung von Funktionen, Namen, Resultaten sollte sich einheitlich und konsistent durchs Design ziehen. Es ist beispielsweise verwirrend, eine Factory-Methode mit „create“ beginnen zu lassen, eine andere aber mit „make“. Wenn die API-Provider die verwendeten und empfohlenen Idiome und Best Practices aufzeigen und sich strikt daran halten, ergibt sich eine Win-Win-Situation.
Fehlerbehandlung: Aufrufe können schief gehen. Erhält die Aufruferin eine klare und aussagekräftige Fehlermeldung, kann sie entsprechende Maßnahmen ableiten. Dazu gehört natürlich ebenso, dass die API systemnahe Ausnahmen abfängt und, soweit möglich, selbst behandelt. Die Entwicklerin muss dann nicht in die Tiefen der API-Implementierung abtauchen, sondern erhält Fehler, die in ihrem eigenen Kontext Sinn ergeben.
Versionierung: Ohne Versionierungskonzept kommt es bei Änderungen der bereitgestellten Funktionalität oft zu Problemen bei Nutzeranwendungen. Eine Versionierung lässt Änderungen zu, ohne Clientcode dysfunktional zu machen. Ein Beispiel sind Versionsangaben in URL-Pfaden wie „……./v1/orders“. Diese Thematik sollten Entwickler nicht unterschätzen, denn zukünftige Änderungen kommen garantiert.
Erweiterbarkeit: Wie bei Ökosystemen und Produktlinien ist es auch bei APIs notwendig, genügend Variabilität für die Nutzer zu gewährleisten, damit diese die Funktionalität in verschiedenen Anwendungen nutzen können. Die Erweiterung um neue Funktionalität muss möglich sein, ohne die Anwendung zu verkomplizieren oder dysfunktional zu machen. Erweiterungen müssen sich gut integrieren und dürfen nicht wie Fremdkörper oder Patches wirken.
Effizienz: Wer große Datenmengen über schmale Datenbandbreiten versendet, Algorithmen unnötig zeitaufwendig gestaltet oder nicht für die benötigte Skalierbarkeit sorgt, erzeugt bei Anwendern Unmut und eine Abstimmung mit den Füßen. Effizienz darf nicht nur ein Schlagwort bleiben, sondern muss tatsächlich umgesetzt sein.
Sicherheit: Nicht nur bei öffentlich zur Verfügung gestellten APIs ist Sicherheit essenziell, sondern auch bei unternehmensinternen Diensten. Daher benötigt eine API Mechanismen, um zum Beispiel Autorisierung, Authentifizierung und Vertraulichkeit zu gewährleisten. Technologien wie OAuth2, SSO, Keycloak sind hierfür prädestiniert.
Resilienz und Verfügbarkeit: Die beste API-Implementierung nützt nichts, wenn sie ständig an Abstürzen und Verfügbarkeitsproblemen leidet. Der API-Provider muss also sowohl in der API als auch in der Infrastruktur für hohe Resilienz und Verfügbarkeit sorgen. SLAs gehören ebenfalls in diesen Kontext. Ganz abgesehen davon, dürften Entwickler wenig Happiness verspüren, wenn die kostenpflichtige API sich als instabil erweist. Oft rentiert sich deshalb das Betreiben der API in einer Cloudumgebung.
Communities: Eine große Community ist der effektiven Handhabung und Nützlichkeit einer API höchst zuträglich, weil sich die Nutzer unter einander austauschen und Hilfe einholen können. Zudem erstellen Drittanbieter dann häufiger Werkzeuge, Dokumente und Best Practice Patterns. Für neue Probleme gibt es in der jeweiligen Community meistens Lösungen oder Workarounds.
Die Bedeutung von APIs wächst beständig. Es sollte uns Entwicklern und Architekten Spaß machen, sie zu nutzen und damit gute Anwendungssoftware zu entwickeln. Sie dürfen nicht als Belastung empfunden werden, sondern als leistungsfähiges Werkzeug für die Umsetzung der eigenen Konzepte. Grund genug für uns, das Thema API in den Hauptfokus dieser Ausgabe zu stellen.
Ihr Prof. Dr. Michael Stal