REST – ein Erfahrungsbericht Mathias Pannier Agenda • Was ist REST? • Transaktionen • Security • Performance • (Mehr) Aufwand • Rest Client in 5 Minuten mathiaspannier.wordpress.com Über mich • Name: Mathias Pannier • Position: Softwareentwickler/Teamleiter • Mehr als 15 Jahre Erfahrung mit Softwareentwicklung in Delphi • Blog: mathiaspannier.wordpress.com mathiaspannier.wordpress.com Fragen • Wer kann mit dem Thema REST/WebService gar nichts anfangen? • Wer hat bereits einen REST Server / WebService erstellt? • Wer hat bereits einen REST Client erstellt bzw. einen WebService benutzt? • Wer hat eine Anwendung mit COM/OLE Automatisierung erstellt bzw. ein eigenes SDK für andere Entwickler zur Verfügung gestellt? • Wer hat bereits eine mehrschichtige Anwendung gebaut? (MIDAS, CORBA) mathiaspannier.wordpress.com Was ist REST? • Representational state transfer (REST) oder RESTful Web services (https://en.wikipedia.org/wiki/Representational_state_transfer) • • • • • Client-Server Stateless Cacheable Layered system Uniform interface mathiaspannier.wordpress.com Was ist REST? • Meine eigene Erklärung jenseits von wikipedia: • • • • ist ein quasi "Standard" für die Entwicklung von verteilten Anwendungen Basis ist das HTTP Protokoll mit den Verben (GET, POST, PUT usw.) alles ist eine URL (Ressource) es geht darum Daten (z.B. aus einer Datenbank) über eine einheitliche (Web) - Schnittstelle zur Verfügung zu stellen • erleichtert die Erstellung unterschiedlicher Clients (Mobil, Win32/64, HTML/JS) • in dem Bereich fällt oft der Begriff JSON • • • • wird meist als leichtgewichtiges Austauschformat gegenüber XML genutzt es kann aber auch XML oder Plain Text verwendet werden ist nicht festgelegt einfache Verwendung in einem HTML/JavaScript Client • Für den weiteren Verlauf ist wichtig zu wissen: Man ruft über HTTP eine URL auf und erhält Daten in Form von JSON zurück. mathiaspannier.wordpress.com Transaktionen • ein größeres Problem bei der Umstellung von C/S zu REST sind Transaktionen • man ist es gewöhnt an einer Stelle (im Client) eine Transaktion zu starten und beliebig viele SQL Abfragen auszuführen (insert, edit, delete, select) • Transaktionen im Client starten ist nicht mehr möglich • es gibt einen Aufruf einer Ressource URL (lesend oder schreibend) • (HTTP) delete from Tabelle1 • (HTTP) delete from Tabelle2 • -> sind 2 Aufrufe in 2 DB Transaktionen • (HTTP) delete from Tabelle1 and Tabelle2 • -> ist ein Aufruf in einer Transaktion mathiaspannier.wordpress.com Transaktionen • um Daten z.B. aus mehreren Tabellen innerhalb einer Transaktion abzufragen (select) gibt es dennoch nur einen (HTTP) Aufruf zum (REST) Server • innerhalb des Servers können wie gewohnt mehrere SQLs in einer Transaktion abgesetzt werden • zu beachten ist: alle benötigten Daten müssen mit einem Aufruf zum Server gesendet werden • Auf keinen Fall mit einem (HTTP) Aufruf eine Transaktion starten, dann mit weiteren Aufrufen Daten lesen/schreiben und mit einem finalen Aufruf die Transaktion beenden. mathiaspannier.wordpress.com Security • Entscheidung zwischen Public vs. Private REST Server • Public: • www.meinedomain.de/api/meinservice • Zugriff von externen Entwicklern möglich/gewünscht • Private: • LAN intern ohne Zugriff von außen (außer VPN) • Zugriff nur durch eigene Programme • das Thema Eingabevalidierung erhält einen viel höheren Stellenwert als in einer klassischen C/S Anwendung • es reicht nicht z.B. in einem HTML Formular das „Required“ Feld zu setzen oder das Feld als E-Mail Adresse zu definieren • alles MUSS serverseitig validiert werden; Client Validierung „nur“ um Usability zu verbessern mathiaspannier.wordpress.com Security • ein GET verrät mehr als ich eigentlich sagen wollte • Wenn Bsp. in einer Anwendung Daten aus einer DB abgefragt werden und je nach Benutzeranmeldung unterschiedliche Felder nicht sichtbar sein sollen, dann dürfen Sie auch nicht mit ausgeliefert werden! • JSON Daten sind "sichtbar" auch wenn Sie nicht in der Oberfläche angezeigt werden • Fehlermeldungen verstecken bzw. „umformulieren“ • eine Datenbank Exception sollte nicht bis zum Benutzer durchdringen • kann von einem Angreifer ausgenutzt werden • interne Datenstruktur sichtbar • Fehlermeldung als HTTP Statuscodes mit Zusatzinformationen mathiaspannier.wordpress.com Performance • Sind REST Server (wenn Sie gut implementiert sind) performanter im Vergleich zu klassischen C/S Anwendungen? • Ja (im WAN) und Nein (im LAN) • SQL Server und deren Zugriffe über TCP/IP sind für LAN Verbindungen ausgelegt • REST Aufrufe haben mehr Zwischenschritte zwischen der DB und dem aufrufenden Client (Serialisierung; ähnlich RPC/COM Aufrufen) mathiaspannier.wordpress.com Performance • das Holen der Daten (wieviel und welche) muss wohl überlegt sein • Balance zwischen der Anzahl der Aufrufe und der zurückgelieferten Datenmenge • jeder Aufruf kostet Zeit bzw. hat einen Overhead • bei HTML JS Clients oder in Multithreaded Anwendungen können mehrere parallele Aufrufe Vorteile bringen WICHTIG: Connection Pooling verwenden • in einem Aufruf sollten Daten aus mehreren Abfragen aggregiert werden (Master - Detail) • man muss seine Anwendungsszenarien vorher gut definieren (am besten GUI Dummy erstellen) mathiaspannier.wordpress.com Performance • Cache • alle großen Webseiten die "schnell" sind "leben" von gecachten Daten • signifikante Performanceverbesserung aber viele "Probleme" (Aktualisierungen) • Browser Cache nutzen (bei HTML/JS Clients) • eigener Client Cache bei Win Anwendung • serverseitiger Cache (Hauptspeicher oder „Memory“ Datenbanken) • Interessantes Video Marco Cecconi - "The Architecture of StackOverflow" https://www.youtube.com/watch?v=t6kM2EM6so4 • Faustregel: So wenig wie möglich Daten mit so wenig wie möglich Aufrufen. mathiaspannier.wordpress.com (Mehr) Aufwand • obwohl von den Marketingstrategen anders behauptet steigt der Aufwand • je nach Programmiersprache/-umgebung gibt es bessere oder schlechtere Unterstützung (Tools für die Erstellung) • man hat (zumindest in der Delphi Welt) min. eine zusätzliche Anwendungsschicht • man muss sich zwangsweise mit dem Thema Webserver (IIS, Apache) auseinandersetzen • einfaches CRUD auf Tabellenebene mit höherem Aufwand • administrativer Aufwand steigt (vorher ein DB Server und ein Client; jetzt 1 DB Server, 1 App Server und mehrere unterschiedliche Clients) • Versionierung der Schnittstelle muss beachtet werden (keine Typsicherheit beim Compilieren) mathiaspannier.wordpress.com Fragen? mathiaspannier.wordpress.com Rest Client in 5 Minuten https://www.youtube.com/watch?v=A0epsUp2Xfc mathiaspannier.wordpress.com