REST-API, wie funktioniert es und warum ist das gut?

Eine REST-API ist eine …

Programmierschnittstelle, die sich an den Paradigmen und Verhalten des World Wide Web (WWW) orientiert und einen Ansatz für die Kommunikation zwischen Client und Server in Netzwerken beschreibt. [1]

Die Namensgebung setzt sich wie folgt zusammen:

  • REpresentational State Transfer
  • Application Programming Interface

Bei einer API handelt es sich, wie der Name schon andeutet, um eine Schnittstelle welche Entwickler verwenden können um zum Beispiel Funktionalitäten einer anderen Software, wie einem Webservice, zu nutzen.

Das klingt soweit ganz gut, also warum sollte solch ein Service „RESTful“ sein?

Um diese Frage zu klären, müssen wir verstehen, was REST ist. Es handelt sich hierbei um einen Ansatz zur Gestaltung der Architektur verteilter Systeme, welcher sich an Standards wie HTTP/S, URI, JSON, …. orientiert. Dabei werden folgende Prinzipien definiert:

  • Das Client-Server Modell beschreibt eine Trennung von Darstellungsebene und Datenhaltung. Durch diese Trennung ist es möglich Clients auf verschiedenen Plattformen zu entwickeln ohne sich jeweils um die Datenhaltung kümmern zu müssen.
  • Ein weiteres Prinzip ist die Zustandslosigkeit. Jede Anfrage an den Server liefert alle Informationen mit, welche nötig sind um den Request zu bearbeiten. Da der Server keine Informationen für zukünftige Anfragen zwischenspeichern muss, führt dies zu einer erhöhten Skalierbarkeit und Zuverlässigkeit. Nachteilig fällt hierbei die erhöhte Netzwerklast aus.
  • Caching: Um den Nachteil der Netzwerklast zu verringern, besteht die Möglichkeit Responses für bestimmte Requests zu cachen. Zum Beispiel können bei einer mobilen Anwendung, welche Inhalte einer Website abbildet, die Inhalte der Startseite für die Dauer einer Stunde gecached werden, da diese Inhalte keiner ständigen Änderung unterliegen.
  • Uniform Interface: Um die Nutzung der Schnittstelle zu vereinfachen, muss diese einheitlich gestaltet werden. Ein Teil dieser Vereinheitlichung ist die Gestaltung der URIs. So könnte man bei einem Taschenrechner folgende Endpunkte/Ressourcen (Methoden, welche sich über HTTP aufrufen lassen) in der Schnittstelle definieren:
    • http://URL/calculator/{number}/add – POST
    • http://URL/calculator/{number}/subtract- POST
    • http://URL/calculator/result – GET

    Obwohl die Schnittstellen auf diese Weise gut lesbar sind, empfiehlt es sich ausführliche Dokumentationen mit Frameworks wie Swagger durchzuführen.

  • Das Prinzip Layered System beschreibt die Aufteilung des Systems in mehrere hierarchisch angeordnete Schichten. So kann eine Trennung von API, Datenverwaltung und Security erfolgen um die Last auf mehrere Server zu verteilen. Nicht nur die Last lässt sich so besser verteilen, es trägt auch zur Übersichtlichkeit des Codes bei.
  • Das Optionale Code-On-Demand Prinzip ermöglicht die Rückgabe von ausführbarem Code wie Applets oder Skripten.

Ein wichtiger Vorteil von REST besteht in der Verwendung des HTTP Standards. Die Ressourcen können über folgende HTTP-Methoden angesprochen werden:

  • GET – holt Daten vom Server
  • POST – legt neue Daten auf dem Server ab
  • PUT –  aktualisiert Daten auf dem Server
  • Delete – löscht Daten vom Server

Die konsequente Verwendung dieser Methoden ermöglicht, dass zu jeder Zeit klar ist, ob ein Request Daten auf dem Server manipuliert oder nur abruft. Besonders bei der Administration können so Zugriffe beliebig beschränkt werden. Man könnte zum Beispiel PUT-Requests und somit das Verändern bestehender Daten nur für bestimmte IPs zulassen.

Weitere Vorteile ergeben sich aus den oben beschriebenen Architekturprinzipien. Dazu gehören:

  • Plattformunabhängigkeit
  • Einheitliche Schnittstellen

Beispiel

Da REST sehr populär ist, haben sich Frameworks entwickelt, welche die Entwicklung von REST-Schnittstellen stark vereinfachen. So bietet zum Beispiel Spring Boot (Java) die Möglichkeit REST-Endpunkte anhand von Annotationen und Methoden zu modellieren. Alles weitere, wie die Herstellung der Verbindungen, generiert Spring Boot automatisch. Der folgende Code-Ausschnitt zeigt einen einfachen Controller, welcher die oben genannten Endpunkte für einen Taschenrechner enthält:

Dabei beginnt der Pfad zu jeder Ressource mit „/calculate“. Es folgen Summand/Subtrahend „/{number:[0-9]+}“ (positive Zahl) und die auszuführende Operation „/add“ oder „/subtract“. Das Ergebnis kann man hier direkt über die Response der POST-Requests im Front-End oder über den GET-Request „/calculate/result“ abrufen.

Ein mit Gradle erstelltes Beispielprojekt dazu kann hier heruntergeladen werden. Die Anwendung kann über eine IDE oder in der Konsole über:

  • „cd project root“
  • „./gradlew bootRun“

gestartet werden. Der Aufruf der Methoden kann über Tools wie das Browserplugin RESTED oder die Anwendung Postman erfolgen (siehe folgende Bilder).

Fazit

Wenn man die Prinzipien von REST verstanden hat und richtig zur Anwendung bringt, können mit REST leicht zu verstehende, skalierbare und vielseitig einsetzbare Schnittstellen entwickelt werden.

 

Quellen:

[1] https://www.cloudcomputing-insider.de/was-ist-eine-rest-api-a-611116/

[2] http://www.prozesse-und-systeme.de/archiREST.html

[3] https://restfulapi.net/rest-architectural-constraints/#layered-system

[4] http://www.m-krausse.de/articles/restIntroduction/index.html

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.