«Ruhelose» Web Services
Artikel erschienen in Swiss IT Magazine 2008/12
Heutige Geschäftsanwendungen verwenden typischerweise Daten und Funktionen aus verschiedensten Systemen, teilweise auch über (Firmen-)Grenzen hinweg. Sie erfordern daher geeignete Technologien, um diese verteilten Systeme miteinander effizient kommunizieren zu lassen und sie auch leicht wartbar zu gestalten. In den letzten Jahren wurden vor allem W3C Web Services – zu denen unter anderem SOAP und WSDL zählen – mit einem Service-orientierten Architekturparadigma eingesetzt, um diese Anforderungen zu erfüllen. SOAP Web Services sind in vielen Fällen eine gute Wahl, denn sie erlauben eine strenge Definition der Services sowie auch der zu übertragenden Daten. Gleichzeitig sind Web Services aber auch eine sehr schwergewichtige Technologie, die eine Vielzahl von zum Teil komplexen Protokollen und Middleware-Systemen erfordert.
Der Begriff REST ist die Abkürzung für den etwas sperrigen Namen «Representational State Transfer» und wurde vom HTTP-Miterfinder Roy Fielding eingeführt. So schwierig der Titel auch sein mag, die Idee ist einfach und bestechend: Die konzeptionell wesentlichsten Begriffe im REST-Umfeld sind Ressource und deren Identifier sowie die Repräsentation der Ressource (siehe Grafik links).
Ressourcen sind, wie der Name schon sagt, Datenelemente oder Ziele einer Anfrage. Dies kann man leicht an einem Beispiel verdeutlichen: Eine Person könnte eine Ressource sein oder ein Artikel in der Datenbank. Jede Ressource ist durch einen eindeutigen Identifier (dies ist üblicherweise eine URL) bestimmt. Dieser Identifier sollte aber selbstbeschreibend sein (wie http://www.example.com/webshop/item/i4325_digital_camera). Ein Client könnte nun eine Anfrage (Request) an diese über den Identifier bestimmte Ressource stellen und würde vom Server ein Ergebnis (Reply) zurückbekommen.
REST-Anwendungen sind im allgemeinen wesentlich leichtgewichtiger als vergleichbare Web-Service-Architekturen. In manchen Diskussionen wird daher versucht, REST gegen Web Services zu positionieren. Tatsächlich ist es vermutlich eher so, dass beide Ansätze klare Vor- und Nachteile haben. Web Services sind beispielsweise viel strenger definiert. Repräsentationen in REST werden häufig geradezu bewusst nicht zu streng (beispielsweise über XML-Schemas) spezifiziert, um eine grössere Fehlertoleranz und Flexibilität in der Anwendung zu ermöglichen.
Zwei Philosophien treffen auch aufeinander, wenn es um die Frage geht, wie ein Client mit einem Service interagieren sollte. Viele Web Service Frameworks versuchen hier, den eigentlichen Serviceaufruf für den Entwickler möglichst zu verstecken. Für den Entwickler stellt sich der Serviceaufruf im Prinzip wie ein lokaler Methodenaufruf dar. Darin liegt eine Stärke, aber auch eine potentielle Gefahr des Ansatzes bezüglich Performance und Sicherheit. Einige Vertreter des REST-Stils sind daher der Meinung, dass der Aufruf nichtlokaler Services auch als solcher erkennbar sein und nicht hinter APIs versteckt werden sollte: Einerseits um dem Entwickler klar zu zeigen, dass es eben kein lokaler Methodenaufruf, sondern ein potentiell teurer externer Serviceaufruf ist, andererseits auch, um an dieser Stelle das Bewusstsein zu schaffen, dass der Datenaustausch hier über Systemgrenzen hinweggeht und somit besondere Beachtung verdient (unter anderem bezüglich Validierung der Daten).
REST ist leichtgewichtig und kann im Prinzip mit den Bordmitteln der meisten Programmiersprachen verwendet werden. Dennoch können Frameworks und Middleware-Komponenten die Entwicklung von REST-Anwendungen sehr erleichtern beziehungsweise REST-Systeme in konventionelle Architekturen integrieren. Im Pool der Apache Software Foundation finden sich auch einige Projekte, die hier hilfreich sein können.
Der Message Broker Apache ActiveMQ (siehe auch Heft 2007/14) ist nicht nur ein JMS Broker, sondern erlaubt auch Protokolltransformationen. Konkret für REST bedeutet dies, dass ActiveMQ eine REST API zur Verfügung stellt, mit der beispielsweise per HTTP eine Nachricht an ActiveMQ gesandt werden kann.
Im Apache-Pool finden sich auch zwei Web-Service-Bibliotheken: Axis 2 und das jüngere CXF. Der Schwerpunkt dieser Projekte liegt auf der Implementierung von W3C Web Service Standards wie SOAP, WSDL, WS-Addressing oder Reliable Messaging. Was weniger bekannt ist: Beide Projekte bieten auch Unterstützung für REST-Anwendungen. Dies bedeutet konkret, dass man Services sowohl via SOAP als auch über ein REST-API anbieten kann. Damit kann man dem Client die Wahl lassen, welches Protokoll bevorzugt wird.
Auch Enterprise Service Busses wie Apache Service Mix oder Mule verwenden Projekte wie CXF, um REST Endpoints zu ermöglichen. Durch das uniforme Interface (Grafik rechts) werden auch Mash-ups leichtgemacht. Es können also XML-Repräsentationen verschiedener REST Services einfach integriert werden. Als Beispiel für einen Mash-up-Service könnte man Yahoo Pipes nennen.
Mittlerweile gibt es auch freie REST-Bibliotheken wie Restlet im Java-Umfeld. Welcher Frameworks man sich konkret bedienen möchte, hängt vom Kontext der eigenen Anwendung ab.
Der REST-Architekturstil erfreut sich stark wachsender Beliebtheit. Offenbar leiden viele Entwickler noch an einem «Kater» vom intensiven Einsatz verschiedenster Web-Service-Protokolle. Das Entwicklungsparadigma von REST unterscheidet sich deutlich vom Ansatz der Web Services. Es ist sehr leichtgewichtig, einfach zu erlernen und baut auf jahrzehntelang erprobten Technologien auf, die erwiesenermassen massiv skalieren und sehr fehlertolerant sind.
Mittlerweile gibt es auch eine Vielzahl an Middleware-Produkten und Frameworks wie ActiveMQ, die eine elegante Integration von REST-Services auch in bestehende Architekturen einfach gestaltet beziehungsweise parallel verschiedene Ansätze betreiben lässt.
REST-Ansätze werden Webservices sicher nicht ablösen – beide Architekturparadigmen haben klare Vor- und Nachteile und können parallel für verschiedene Problemstellungen zum Einsatz gebracht werden.
REST im Vergleich zu RPC
Web-style Programming
Alexander Schatten (alexander@schatten.info) ist Assistent am Institut für Softwaretechnik und interaktive Systeme der Technischen Universität Wien.