Eine REST API (Representational State Transfer Application Programming Interface) ist ein Architekturstil, der allgemein als Standard für das Design und die Entwicklung der vernetzten Anwendungen gilt, die das Web ermöglichen. Es bietet eine Reihe von Regeln und Einschränkungen, die, wenn sie befolgt werden, zu Webdiensten führen, die einfach, skalierbar und leicht zu integrieren sind.
Eine REST API ist eine API, die den Designprinzipien des REST-Architekturstils entspricht. Im Kern dreht sich REST um das Konzept von Ressourcen. Das können beliebige Informationen sein, zum Beispiel ein Nutzer, ein Produkt, ein Dokument oder eine Sammlung von Elementen.
Eine REST API bietet einer Clientanwendung die Möglichkeit, auf diese Ressourcen zuzugreifen und sie mithilfe eines vordefinierten Satzes zustandsloser Operationen zu bearbeiten.
Eine Clientanwendung (z. B. eine mobile App, ein Webbrowser oder ein anderer Server) initiiert eine Anfrage an die API, um eine Aktion auszuführen. Diese Anfrage wird an eine bestimmte URL gesendet und enthält eine HTTP-Methode, Header mit Metadaten und manchmal einen Anfragetext mit Daten.
Der Server empfängt und validiert die Anfrage und bestätigt, dass der Client authentifiziert und autorisiert ist, die angeforderte Aktion auszuführen. Anschließend wird die Anfrage verarbeitet. Dabei können Daten aus einer Datenbank abgerufen, eine neue Ressource erstellt oder eine vorhandene aktualisiert werden.
Nach der Verarbeitung der Anfrage sendet der Server eine Antwort an den Client zurück. Diese Antwort enthält einen HTTP-Statuscode, der das Ergebnis angibt (z. B. 200 OK bei Erfolg, 404 Nicht gefunden, wenn die Ressource nicht vorhanden ist, 401 Nicht autorisiert bei Sicherheitsproblemen), sowie die angeforderten Daten im Antworttext.
Die zwischen Client und Server übertragenen Daten sind eine „Darstellung“ des Zustands der Ressource. JSON (JavaScript Object Notation) ist das gängigste Format für diese Daten, da es schlank, menschenlesbar und für Programmiersprachen einfach zu parsen ist.
Die Leistungsfähigkeit und Skalierbarkeit von REST beruhen auf einer Reihe von architektonischen Einschränkungen, die das Design bestimmen. Ein System, das diese Einschränkungen erfüllt, wird als „RESTful“ bezeichnet.
Eine Ressource ist ein grundlegendes Konzept in REST. Es ist ein Objekt mit einem Typ, zugehörigen Daten, Beziehungen zu anderen Ressourcen und einer Reihe von Methoden, die darauf angewendet werden können. In einer E-Commerce-API wären beispielsweise ein „Produkt“ oder ein „Kunde“ Ressourcen.
Jede Ressource wird klar durch einen URI identifiziert. Eine gut gestaltete API verwendet übersichtliche, beschreibende und konsistente URIs, um ihre Ressourcen zu identifizieren. Beispielsweise kann /users eine Sammlung von Nutzern identifizieren und /users/123 einen bestimmten Nutzer mit der ID 123.
Ein Client interagiert nicht direkt mit der Ressource, sondern mit einer Darstellung dieser Ressource. Das gängigste Darstellungsformat ist JSON, aber auch andere wie XML oder HTML können verwendet werden. So lässt sich der Zustand einer Ressource flexibel darstellen.
Jede Anfrage eines Clients an den Server muss alle Informationen enthalten, die der Server benötigt, um die Anfrage zu verstehen und zu verarbeiten. Der Server speichert zwischen Anfragen weder Clientkontext noch Sitzungsstatus. Diese Einschränkung macht REST APIs hochgradig skalierbar, da jeder Server jede Anfrage verarbeiten kann.
Client und Server sind getrennt, wobei die API als Schnittstelle zwischen ihnen fungiert. Durch diese Trennung der Zuständigkeiten können sich die clientseitige und die serverseitige Anwendung unabhängig voneinander entwickeln.
REST erfordert eine konsistente, einheitliche Schnittstelle zwischen Client und Server. Dies wird durch die Verwendung von Standard-HTTP-Methoden, URIs zur Ressourcenidentifizierung und Hypermedia als Engine des Anwendungsstatus (HATEOAS) erreicht.
Antworten vom Server sollten als cachefähig oder nicht cachefähig definiert werden. Wenn eine Antwort im Cache gespeichert werden kann, kann ein Client oder Vermittler diese Antwort für nachfolgende, identische Anfragen wiederverwenden. Dies kann die Leistung erheblich verbessern und die Serverlast reduzieren.
Ein Client, der mit einer REST API verbunden ist, kann normalerweise nicht erkennen, ob er direkt mit dem Endserver oder mit einem Zwischenserver verbunden ist. Zwischenserver wie API-Gateways oder Load Balancer können in die Architektur eingebunden werden, um Skalierbarkeit, Sicherheit und Leistung zu verbessern.
URIs sollen Ressourcen darstellen, daher sollten sie Nomen verwenden (Plural für Sammlungen, Singular oder eine ID für ein bestimmtes Element) und keine Verben. Verwenden Sie beispielsweise user/users, um alle Nutzer darzustellen, nicht /getAllUsers.
Verwenden Sie die Standard-HTTP-Verben, um Aktionen darzustellen: GET zum Abrufen, POST zum Erstellen, PUT zum Aktualisieren und DELETE zum Entfernen. So entsteht eine vorhersehbare und konsistente Benutzeroberfläche.
Ein wichtiger Grundsatz von REST ist, dass eine Antwort Links zu anderen verwandten Aktionen oder Ressourcen enthalten sollte. So kann sich der Client dynamisch in der API bewegen, ohne URI-Muster fest codieren zu müssen.
Wenn Sie nicht abwärtskompatible Änderungen an einer API vornehmen müssen, führen Sie eine neue Version ein. Normalerweise wird die Versionsnummer in den URI aufgenommen, z. B. /api/v2/users. So können bestehende Clients die alte Version weiter verwenden, während neue Clients die neue Version nutzen können.
Wenn eine Anfrage fehlschlägt, sollte im Antworttext eine klare, hilfreiche Fehlermeldung zusammen mit dem entsprechenden HTTP-Statuscode (z. B. 400 Bad Request, 500 Internal Server Error) bereitgestellt werden. So kann der Entwickler auf der Clientseite nachvollziehen, was schiefgelaufen ist.
Schützen Sie Ihre API durch eine robuste Authentifizierung (z. B. OAuth 2.0, API-Schlüssel), mit der die Identität und Autorisierung des Clients geprüft wird. So kann der Client dann nur auf die Ressourcen zugreifen, die er sehen darf. Verwenden Sie immer TLS/SSL, um den Traffic zu verschlüsseln.
Für Endpunkte, die eine große Anzahl von Elementen zurückgeben können, sollten Sie die Paginierung implementieren, um Daten in überschaubaren Blöcken zurückzugeben. Außerdem sollten Sie Abfrageparameter bereitstellen, damit Clients die Ergebnisse filtern und sortieren können. So wird die Menge der übertragenen Daten reduziert.
Einfachheit und Lesbarkeit
REST APIs verwenden HTTP-Standardmethoden und menschenlesbare URIs, sodass sie für Entwickler relativ einfach zu erlernen, zu verwenden und zu debuggen sind. Die selbstbeschreibende Natur der Schnittstelle vereinfacht Einbindungsarbeiten.
Skalierbarkeit
Die Zustandslosigkeit von REST ist ein wichtiger Faktor für die Skalierbarkeit. Da der Server keine Clientsitzungen verwalten muss, lassen sich Anfragen einfach auf mehrere Server verteilen. Außerdem können neue Server hinzugefügt werden, um eine höhere Last ohne zusätzliche Komplexität zu bewältigen.
Flexibilität
REST unterstützt eine Vielzahl von Datenformaten, wobei JSON aufgrund seiner Einfachheit und breiten Unterstützung am beliebtesten ist. Diese Flexibilität ermöglicht die Verwendung von REST APIs durch verschiedenste Clientanwendungen, von Webbrowsern über mobile Geräte bis hin zu IoT-Sensoren.
Entkopplung von Client und Server
Die durch REST erzwungene Client-Server-Architektur sorgt für eine klare Trennung der Zuständigkeiten. So können Entwickler unabhängig voneinander am clientseitigen Frontend und am serverseitigen Backend arbeiten, was Entwicklungszyklen beschleunigen kann.
Sprachunabhängig
Da REST ein Architekturstil ist, der auf dem HTTP-Standard basiert, kann er in jeder Programmiersprache implementiert und von jedem Client verwendet werden, der HTTP-Anfragen stellen kann. Dies ermöglicht maximale Interoperabilität zwischen verschiedenen Technologiestacks.
Ein häufiger Anwendungsfall ist eine mobile Wetter-App, die aktuelle Wetterdaten für einen bestimmten Ort von einer öffentlichen Wetter-API abruft.
Die Clientanwendung sendet eine HTTP-GET-Anfrage an den API-Endpunkt, die den Standort und einen API-Schlüssel zur Authentifizierung enthält.
curl "https://api.weather-service.com/v1/current?location=94043&key=YOUR_API_KEY" |
curl
"https://api.weather-service.com/v1/current?location=94043&key=YOUR_API_KEY"
Der Server verarbeitet die Anfrage, ruft die Wetterdaten für den angegebenen Ort ab und gibt eine JSON-Antwort zurück.
{ "Temperatur": 20, "Einheit": "Celsius", "Wetterbedingungen": "Klar", "Feuchtigkeit": 55 } |
{
"Temperatur": 20,
"Einheit": "Celsius",
"Wetterbedingungen": "Klar",
"Feuchtigkeit": 55
}
In einer Mikrodienstarchitektur muss ein „Produkt“-Dienst möglicherweise einen aktualisierten Preis von einem „Inventar“-Dienst abrufen, bevor er ihn auf einer E-Commerce-Website anzeigt.
Der Produktdienst sendet eine interne HTTP-GET-Anfrage an den API-Endpunkt des Inventardienstes für eine bestimmte Produkt-ID.
curl "http://inventory-service.internal/api/products/PN-5821/price" |
curl
"http://inventory-service.internal/api/products/PN-5821/price"
Der Inventardienst ruft den aktuellen Preis ab und gibt eine einfache JSON-Antwort zurück.
{ "produktId": "PN-5821", „Preis“ "Währung": "USD" } ``` |
{
"produktId": "PN-5821",
„Preis“
"Währung": "USD"
}
```
Profitieren Sie von einem Guthaben über 300 $, um Google Cloud und mehr als 20 „Immer kostenlos“-Produkte kennenzulernen.