Java EE 7: Web Services

RESTful Service mit JAX-RS konsumieren

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
JAX-RS erlaubt es seit der Java EE 7, RESTful Services auch zu konsumieren. In diesem Video lernen Sie, wie Sie dabei vorgehen müssen und erstellen einen Client, der auf verschiedene Arten mit einem RESTful-Service interagiert.

Transkript

In diesem Video werden wir uns damit auseinandersetzen, wie wir auf Ebene der JAX-RS einen RESTful Service Client implementieren können. Seit Version 7 der Java EE gibt es diese Möglichkeit. Vorher war es nötig, auf proprietäre Ansätze zurückzugreifen. Wenn wir auf Ebene der JAX-RS arbeiten wollen, müssen wir zuerst beachten, dass die JAX-RS nur eine Spezifikation ist. Das bedeutet, wir brauchen eine Implementierung der API. Hier gibt es verschiedene Varianten, zum Beispiel Apache Jersey oder RestEasy von der JBoss Foundation. Wir werden im weiteren Verlauf auf RestEasy zurückgreifen. Die Vorgehensweise ist dabei immer die gleiche, egal ob Sie Jersey oder RestEasy oder eine andere Implementierung verwenden. Sie benutzen einen ClientBuilder, um eine Client-Instanz zu erzeugen. Mit dieser Client-Instanz erzeugen Sie Target-Instanzen. Jede Target-Instanz repräsentiert letztlich eine Aktion, die Sie auf dem RESTful Service ausführen wollen. Zu einer Target-Instanz fügen Sie dann bei Bedarf Parameter hinzu und rufen danach auf Ebene dieser Target-Instanz mit deren Methoden @GET, @POST, @PUT, oder @HEAD die jeweiligen Aktionen auf und verwenden dabei die entsprechende HTTP-Methode. Das Ganze läuft dann so ab, dass Sie das in aller Regel mit einer Fluid-API definieren. Das bedeutet, Sie schreiben nicht mehr einzelne Objekte, sondern verwenden eine hintereinander fließende Schreibweise. Das werden wir gleich sehen. Bevor wir den RestService Client definieren können, lassen Sie uns zuerst schauen, wie dieser RestService, den wir ansprechen wollen, überhaupt aussieht. Wir haben hier einen RESTful Service, der ist über den lokalen Pfad simple erreichbar und stellt zwei Aktionen oder Methoden bereit, nämlich die Methode sayHello, die erreichbar ist über den Pfad single, und die Methode sayHelloMultipleTimes, die erreichbar ist über den Pfad multiple und dabei am Ende des Pfads noch einen Parameter mit sich führt, nämlich den hier gekennzeichneten count-Parameter, der dann entsprechend an die Methode mit übergeben wird. Intern passiert hier nichts anderes, als dass eine Nachricht mehrfach verarbeitet wird. Diesen RESTful Service wollen wir nun anbinden. Zu diesem Zweck werden wir in Eclipse ein neues Java Project anlegen. Dieses Java-Projekt bekommt den Namen RestfulClient. Es handelt sich um ein ganz normales Java-Projekt. Was wir allerdings machen, um etwas mehr Komfort zu haben, ist, wir konvertieren dieses Projekt in ein Maven-Projekt. Erstmal rüber in das Kontextmenü, dann die Option Configure, Dort haben wir Convert to Maven Project. Nachdem wir dies erledigt haben, können wir die benötigten Dependencies hinzufügen. Wir öffnen dazu, falls noch nicht geschehen, die Datei pom.xml per Doppelklick. Dann öffnet sich der hier sichtbare Assistent. Hier wechseln wir in den Reiter Dependencies und fügen die Dependencies, die wir brauchen hinzu. Das ist zum einen die jaxrs-api. Hier verwenden wir die von JBoss und dem RestEasy-Projekt. Auch fügen wir den resteasy-client hinzu. Auch hier nehmen wir die Vorgabe aus dem JBoss-Projekt. Nun brauchen wir noch einen sogenannten Provider für die Serialisierung nach JSON. Auch hier verwenden wir die Vorgabe aus dem RestEasy-Projekt von JBoss, nämlich den resteasy-jackson2-provider. Damit haben wir unsere Abhängigkeiten definiert und sobald wir die Datei speichern, wird Maven im Hintergrund die entsprechenden Abhängigkeiten herunterladen. Das Ganze können wir noch erzwingen, indem einen Rechtsklick auf das Projekt machen, Maven aus dem Kontextmenü auswählen und dann Update Project auswählen. Eventuell setzen wir das Häkchen bei Force Update of Snapshots/Releases. Sollte das bei Ihnen so nicht funktioniert haben und Sie eine Fehlermeldung erhalten, kann es durchaus sinnvoll sein, über Window Preferences in den Bereich Maven zu wechseln und hier das Häkchen bei Download repository index updates on startup zu setzen. Nachdem Sie das bestätigt haben und Eclipse neu gestartet haben, sollten Sie in der Lage sein, die Abhängigkeiten entsprechend hinzuzufügen. Die Verwendung von Maven erspart es uns, dass wir hier einzelne Bibliotheken von Hand herunterladen müssen. Es sind nämlich einige Abhängigkeiten, die wir zu implementieren haben. Nun können wir die Java-Klasse anlegen, in der der Client implementiert ist. Der Client ist implementiert als eine ganz normale Java-Klasse. Wir nennen ihn RestfulClient. Und wir geben ihm ein Package mit, de.video2brain.services.clients ist das Package. Nun brauchen wir, bevor wir an die weitere Implementierung gehen, eine zusätzliche Datentransferklasse. Der RESTful Service liefert uns die Daten als JSON zurück und erwartet auch die Daten als JSON geliefert. Das müssen wir abbilden. Die einfachste Variante ist, eine entsprechende Hilfsklasse anzulegen. Das machen wir, auch eine ganz normale Java-Klasse. Diese Klasse können wir beliebig nennen. Ich nenne sie MessageDTO. DTO für Data Transfer Object. Das Ganze lege ich auch in diesem clients-Package mit an. Dieses Message DTO verfügt letztlich über einen privaten Member. Der ist gekapselt, sodass wir per Getter, Setter darauf zugreifen können. Der Name des Member ist message. Nun können wir uns tatsächlich an die eigentliche Implementierung des RestClient machen. Dazu werden wir zuerst die einfache Variante des Aufrufs umsetzen. Wenn wir nochmal in den Service reinschauen, möchten wir also den Aufruf auf diese Methode sayHello umsetzen. Die bekommt hier ein MessageModel als Input. Wenn wir uns dieses MessageModel anschauen, entspricht dessen Aufbau ziemlich genau dem, was wir in diesem MessageDTO auch implementiert haben. Und wir bekommen auch ein MessageModel als Rückgabe. Das heißt, wir können hier das von uns definierte MessageDTO-Objekt benutzen. Um das zu erledigen, werden wir zuerst den Aufruf implementieren. Und zwar muss ich zuerst ein request-Objekt definieren, nämlich das Objekt, das dann serialisiert werden soll und an den Server übertragen werden soll. Das ist die Nachricht, die der Server entgegennimmt. Die nennen wir zum Beispiel Sonnenschein!. Jetzt können wir uns an den eigentlichen Client machen. Der Client wird uns auch eine Instanz dieses MessageDTO zurückgeben. Die nennen wir response. Diesen Client erzeugen wir über ClientBuilder. ClientBuilder liegt im Package javax.ws.rs.client.ClientBuilder. Der verfügt über die Methode newClient. Jetzt arbeiten wir auf Ebene dieser Instanz direkt weiter. Wir definieren jetzt das target, also die aufzurufende Ressource. Das ist die Adresse des RESTful Service. In unserem Fall ist das eine lokal liegende Sache. Das heißt, wir geben hier den Pfad zu diesem RESTful Service ein. Den bekommen Sie im Zweifelsfall von Ihrem Anbieter dann auch genannt. Als Letztes noch den Namen der Operation, die wir ausführen wollen, single. Wir machen eine Anforderung mit MediaType.APPLICATION_JSON. Wir senden unser request-Objekt, und zwar als JSON-serialisiertes Objekt. Das machen wir über Entity.json und geben da als Parameter unser request-Objekt mit rein. Und die Rückgabe ist auch vom Typ dieses request-Objekts, ausgedrückt über request-Objekt oder response-Objekt, Punkt, class. Nun haben wir den Aufruf gebaut und wir können das entsprechende Ergebnis anschauen. Wenn wir also dieses Projekt ausführen, werden wir die gewünschte Ausgabe bekommen. Das war nicht wirklich kompliziert, deshalb können wir direkt fortfahren beim Abruf der etwas komplexeren Methode aus dem RESTful Service, nämlich die Methode, die über den Pfad multiple unter Angabe der Anzahl erreichbar ist und die uns eine Liste von Objekten zurückgeben wird. Es ist bei solchen Sachen immer wichtig, das Datenformat der Objekte zu kennen. In unserem Fall haben wir das ja schon implementiert in Form dieser DTOs. Wir wissen also, dass wir eine Liste von DTOs zurückbekommen. Das werden wir hier auch erstmal notieren. Wir legen eine Liste aus dem Package java.util an, vom Typ MessageDTO, das wird die Rückgabe des Servers sein. Die holen wir uns, indem wir einen neuen Client erzeugen. Das kopieren wir jetzt einfach, weil es etwas einfacher ist, auf dasselbe oder auf ein ähnliches target zu verweisen wie der Client, den wir zuvor genutzt hatten, diesmal allerdings nicht auf die Methode single sondern auf die Methode multiple. Wir werden hier einen Platzhalter einbauen. Das machen wir über die Methode path. Diesen Platzhalter definieren wir mit einem frei wählbaren Platzhalternamen und lösen ihn dann später auf über die Methode resolveTemplate. Diese Methode resolveTemplate nimmt denselben Platzhalternamen entgegen. Jetzt können wir hier die Anzahl der Durchläufe in diesem Fall definieren. Warum mache ich das mit path und resolveTemplate? Ganz einfach. Es verhindert, dass ich das hier oben fest in die Adresse reinschreiben muss. So bleibe ich flexibel und kann das später entsprechend meiner programmlichen Gegebenheiten immer wieder anpassen. Wir posten wieder Daten zum Service. Das machen wir in Form eines json-Requests, ausgedrückt über Entity.json. Der Parameter ist unser request-Objekt. Die Rückgabe ist diesmal allerdings nicht eine einzelne Instanz wie weiter oben, sondern eine Liste vom Typ MessageDTO. Das Ganze muss ich etwas komplizierter ausdrücken, und zwar in Form einer GenericType-Angabe. Diese GenericType-Angabe ist vom Typ List of MessageDTO. Hier kommt noch eine öffnende und eine schließende geschweifte Klammer hinterher. Wenn ich GenericType importiert habe, habe ich hier keinen Fehler mehr drin und kann dann den RestClient ausführen. Im Moment sehen wir allerdings noch nicht, was wir vom Service zurückbekommen. Deshalb implementieren wir jetzt noch eine for-each-Schleife, wo wir die MessageDTOs einfach durchlaufen, die uns vom Service zurückgegeben worden sind, und deren Nachricht, einfach so wie sie ist, ausgeben. Nun können wir auch sehen, was wir vom Service zurückbekommen. Jetzt können wir unseren Client erneut starten. Und wir sehen die Ausgabe entspricht unseren Erwartungen. Die Methode hat uns offenbar eine Liste von Objekten zurückgegeben. In diesem Video haben wir uns damit auseinandergesetzt, wie wir einen Client für einen RESTful Service mit JAX-RS bauen können. Wir haben die benötigten Dependencies aufgelöst und zwei Beispiele dafür durchgearbeitet. Bei einem Beispiel haben wir auch path-Parameter benutzt und entsprechend aufgelöst. Was ich sehr spannend und interessant finde, ist einfach, dass das Ganze geschieht, ohne dass wir uns direkt auf Ebene der Nachrichten und der Übertragung begeben müssen. Das alles wird von JAX-RS für uns abgehandelt. Das macht diese API und die Implementierungen so spannend. Ich kann mich komplett auf meinen Java-Code konzentrieren und muss mich wieder nicht mit den Details der Verarbeitung und des Abrufs auseinandersetzen.

Java EE 7: Web Services

Steigen Sie ein in die Java-Enterprise-Welt und lernen Sie, wie Nachrichten ausgetauscht und Dienste definiert werden.

5 Std. 13 min (30 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!