REST
Links[Bearbeiten]
https://medium.com/extend/what-is-rest-a-simple-explanation-for-beginners-part-1-introduction-b4a072f8740f https://www.cloudcomputing-insider.de/was-ist-eine-rest-api-a-611116/ https://dev.to/ibmdeveloper/what-is-curl-and-why-is-it-all-over-api-docs-9mh
Auch Interessant dazu
https://jsonplaceholder.typicode.com/ (REST API mit JSON Demo Daten testen) https://egghead.io/lessons/javascript-creating-demo-apis-with-json-server - Wie testet man mit jsonplaceholder. https://github.com/typicode/json-server kleiner json Server der als Basis für jsonplaceholder dient.
Allgemeines[Bearbeiten]
REST = REpresentational State Transfer API für Application Programming Interface
- REST ist ein Ansatz für die Client Server Kommunikation im Netz und funktioniert prinzipiell ähnlich wie das Ausliefern von Webseiten.
- REST APIs sind nützlich in verteilten IT-Systemen.
- REST ist KEIN Protokoll und auch kein Standard sondern eher ein Prinzip oder Design Pattern für Schnittstellen. Erfüllt ein Service mit seiner Schnittstelle dieses Muster spricht man von einer RESTful API.
- REST nutzt aber Standard-Protokolle und Datenstandards wir HTTP/S, UärI, JSON, XML
Ursprung[Bearbeiten]
- Von Roy Fielding als Konzept parallel zu HTTP 1.1 entwickelt.
- 2000 in seiner Dissertation „Architectural Styles and the Design of Network-based Software Architectures“ vorgestellt.
- WorldWideWeb und Browser bieten daher schon fast alles was man braucht. Statische Webseiten werden z.B. nach dem REST Prinzip ausgeliefert.
- Für Programme nutzt man oft JSON oder XML als Format und nicht HTML da diese besser maschinell verarbeitet werden können.
Wichtige Begriffe[Bearbeiten]
Client — Der Client nutzt die API. Oft ist das eine Person die am Browser sitzt und eine Webseite anfordert. Du könntest auch ein Client Skript schreiben, das die Twitter API nutzt um Post zu holen oder zu schreiben. Dein Programm wäre ei Client das den RESTful Service von Twitter nutzt.
Resource — eine Resource ist das was der Client anfordert. Oder allgemeiner, ein Objekt über welches die API Informationen liefern kann. In Instagram wäre das z.B. ein User, ein Photo oder ein Hashtag. Jede Resource hat eine eindeutige Bezeichung denn Identifier. Z.B. eine Zahl oder ein Name. Wichtig ist die Eindeutigkeit. Eine Resource hat bestimmte Eigenschaften über welche die API Auskunft geben kann. Z.B. den Namen eines Users.
Prinzipien[Bearbeiten]
REST gibt nicht vor wie ein Service im Detail implementiert oder Programmiert wird. Vielmehr gibt es sechs Architekturprinzipien (Constraints).
Client-Server-Modell[Bearbeiten]
REST verlangt ein Client-Server-Modell. D.h. Daten und Nutzerinterface sind getrennt. Der Server liefert die Daten an den Client.
Vorteile: Clients einfach auf verschiedenen Plattformen einzurichten. Server einfacher skalierbar.
Zustandslosigkeit (stateless)[Bearbeiten]
Client und Server kommunizieren zustandslos („stateless“). D.h. der Client schickt bei jeder Anfrage alle Informationen die der Server benötigt. Der Server muss sich nichts "merken".
Vorteil: Zuverlässigkeit, Einheitlichkeit, Skalierbarkeit. Nachteil: mehr Overhead bei der Netzwerkkommunikation (weniger Performance)
Caching[Bearbeiten]
Clients dürfen vom Server gesendete Antworten auch speichern und wiederverwenden. Der Server kennzeichnet Informationen müssen als „cacheable“ oder „non-cacheable“.
Vorteile: Höhere Effizienz durch weniger Traffic und dadurch leichter skalierbar. Nachteile: Risiko dass der Client veraltete Daten aus dem Cache nutzt.
Einheitliche Schnittstelle[Bearbeiten]
Die Schnittstelle ist einheitlich und von der Art des Dienstes unabhängig.
Vorteil: Einfache Architektur mit erhöhter Visibilität von Interaktionen. Nachteil: U.u. leidet die Effihienz als bei auf die Anwendung spezialisierten Lösungen. Alle Informationen müssen in ein standardisiertes Format gebracht werden.
Layered System[Bearbeiten]
Es gibt mehrere, hierarchisch Angelegte Schichte. Jede Schicht (Layer) hat bestimmte Aufgaben. Jeder Layer interagiert nur mit den direkt angrenzende Schichten. Die Layer können für verschiedene Aufgaben eingesetzt werden. Z.B. Security Layer, Load Balancer, Caching. Die eigentliche Information wird unverändert weitergegeben.
Vorteile: Zusätzliche Funktionalität entkoppelt (gekapselt) von der eigentlichen Kommunikation, Skalierbarkeit Nachteil größerer Overhead, größerer Latenz mit jeder Schicht.
Code-On-Demand[Bearbeiten]
Dies ist keine Bedingung sondern eine Option. REST erlaubt dass der Client Programmteile nachladen kann. Z.B. über Skripte oder Applets. Dies kann aber als Bedingung auch ausgeschlossen oder deaktiviert werden.
Praxis[Bearbeiten]
Für Restserverices nutzt man in der Praxis i.d.R. das HTTP oder HTTPS Protokoll. Also das gleiche das für das Ausliefern von Webseiten zuständig ist. Der Client (z.B. ein Webbrowser) fordert eine URL/URI auf und bekommt vom Server eine Antwort.
HTTP Methoden geben an, welche Operation der Service ausführen soll:
GET | POST | PATCH | DELETE
Ausprobieren[Bearbeiten]
http://jsonplaceholder.typicode.com/ verfügbare Fake Online REST API for Testing and Prototyping.
Der Service von jsonplaceholder kann eine Menge von zusammenhängenden Datensätzen liefern. Dazu gehören Posts, Kommentare, Fotos, Alben, Todo-Listen, Nutzer... Die Methoden die man nutzen kann sind:
GET - fordert Daten vom Server an POST - übermittelt Daten an den Server PUT/PATCH - ändern bestehende Daten auf dem Server DELETE - löscht bestehende Daten auf dem Server
Aufrufe die Daten verändern (DELETE / PUT) werden dabei vom Server nicht ausgeführt aber angenommen. So kann man testen wie man möchte. Folgender Aufruf:
https://jsonplaceholder.typicode.com/posts?userId=3
startet eine GET Anfrage und liefert alle Posts des Users mit der ID 3 im JSON Format.
Ein einfaches Skript[Bearbeiten]
Außer über die URL kann man natürlich auch ein Skript auf eine REST API loslassen. In PHP kann so etwas prinzipiell folgendermaßen aussehen.
<?php
//Verbindung zum Server definieren
$verbindung = curl_init();
curl_setopt($verbindung, CURLOPT_URL, "http://jsonplaceholder.typicode.com/posts?userId=3");
curl_setopt($verbindung, CURLOPT_RETURNTRANSFER, true); // Daten als String zurueckliefern
//Daten abrufen
$antwort = curl_exec($verbindung);
//JSON decodieren
$daten = json_decode($antwort, true);
//Jeden Eintrag samt Nummer anzeigen
foreach ($daten AS $eintrag) {
print ($eintrag['id'].": ".$eintrag['title']."\n");
}
//Verbindung schliessen
curl_close($verbindung);
?>
In diesem Fall nutzen wir cURL Bibliothek. Die Abkürzung cURL steht für client URL. Im Prinzip ist es nur ein Tool, mit dem man Daten einfach per Skript über verschiedene Protokolle anfordern kann (https, ftp...)