Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Java EE 7: Web Services

RESTful Service mit JAX-RS erzeugen

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Einen RESTful Service mit JAX-RS zu bauen, geht ganz schnell - welche Schritte dafür nötig sind, erläutert dieses Video ebenso, wie die Rückgabe unterschiedlicher Datenformate und die Übergabe von Parametern in der Webadresse.

Transkript

In diesem Video werden wir uns damit auseinandersetzen, wie wir einen RESTful Service definieren können, wie wir verschiedene HTTP-Zugriffsmechanismen auf Ebene der Methoden umsetzen können, und wie wir dafür sorgen können, dass der Service bestimmte Ausgabe- und Rückgabeformate unterstützt. Auch werden wir klären, was wir tun müssen, um so einen RESTful Service überhaupt erstmal von außen verfügbar zu machen. Der erste und wichtigste Schritt besteht darin, dass wir eine Klasse, in der die Methoden, die von außen erreichbar sein sollen, sich befinden, mithilfe der @Path-Annotation als genauso eine Klasse definieren, die über einen RESTful Service angesprochen werden kann. Dazu definieren wir die Annotation auf Klassenebene. Können Sie aber optional noch auf Methodenebene definieren. Auf Klassenebene geben wir den Stammpfad an, über den die dann folgenden Methoden erreichbar sein werden. Und auf Methodenebene können wir lokale Pfade angeben. Die einzelnen Methoden sind dann mit @GET-, @POST-, @PUT- oder @DELETE-Annotationen versehen. Die entsprechen natürlich den HTTP-Methoden, die für den Zugriff auf diese RESTful-Service-Methoden zulässig sind. Wenn wir die @Path-Annotation auf Klassen- und Methodeebene definieren, können die Methoden mithilfe dieser Annotation dafür sorgen, dass nicht der eigentliche Methodenname als Name im RESTful Service verwendet wird, sondern ein sprechenderer, oder ein kürzerer, oder ein besser geeigneter Name genutzt wird. Auch können wir mithilfe der @Path-Annotation sogenannte Path Parameter definieren. Path Parameter sind Platzhalter in der anzuspringenden URL. Mit der @PathParam-Annotation können wir diese dann an Felder binden. Grundsätzlich können RESTful Services mit ihren Methoden alle möglichen Rückgabeformate unterstützen. Dies kann glücklicherweise mit der @Produces-Annotation eingeschränkt werden. Die @Produces-Annotation gibt nämlich an, welche Arten von Rückgaben möglich beziehungsweise erlaubt sind. Wenn dort mehrere zur Auswahl stehen, kann der Client über seinen ACCEPT-Header sagen, welches Format er unterstützt. Diese @Produces-Annotation und übrigens auch die @Consumes-Annotation, die es auch gibt, ist nämlich notiert im Format eines Media Type, eines MIME Type, also beispielsweise application/json oder text/xml. Mit dieser Information kann der Client sagen, was er möchte, und der Server kann ihm das gewünschte Rückgabeformat, soweit unterstützt, erzeugen. Damit das Ganze grundsätzlich funktioniert, brauchen wir noch etwas Infrastruktur. Nämlich, wir müssen eine Klasse im Archiv haben, die von der Basis-Klasse Application erbt. Diese Klasse, der Name ist egal, ist dann annotiert mit der @ApplicationPath-Annotation. In dieser @ApplicationPath-Annotation geben wir den Basispfad, also zum Beispiel /api/"irgendeine Versionskennung" oder irgendwas anderes dann an. Mit dieser Information kann dann der RESTful Service aufgebaut werden. Also, wir brauchen eine Application-Ableitung und mindestens eine Java-Klasse. Die Application-Ableitung braucht die @ApplicationPath-Annotation und die Java-Klasse braucht die @Path-Annotation und kann dann auf Methodenebene Path Parameter definieren und die Methoden über @GET-, @HEAD-, @PUT-, oder @DELETE-Annotationen aussteuerbar und ansprechbar machen. Im Folgenden werden wir dies einmal in einem Beispiel umsetzen. Ich befinde mich in Eclipse. Ich werde jetzt erstmal ein neues Java EE Application Project anlegen. Dazu nehme ich das Enterprise Application Project und gebe dem einen entsprechenden Namen, zum Beispiel RestfulServices. Ich brauche hier als Module eigentlich nur das EJB-Modul und eventuell ein Web-Modul. Jetzt habe ich letztlich alles angelegt. Die weitere Arbeit findet jetzt erstmal nur auf Ebene des EJB-Moduls statt. Im ersten Schritt werde ich die Applikationsklasse anlegen. Dazu lege ich eine ganz normale Java-Klasse an. Die nenne ich ApplicationConfiguration. Dieser Name ist frei wählbar, das ist kein Problem, sollte sich in einem Package befinden. Dann bin ich im Grunde fast durch mit dieser Applikationskonfiguration. Ich muss jetzt sagen, dass diese Klasse von der Basisklasse Application erbt. Und zwar ist das die aus dem javax.ws.rs.core Package. Nun brauche ich noch die @ApplicationPath-Annotation. Hier gebe ich den Basispfad meines Service an. Üblicherweise hat das Ding den Präfix api und dann sogar meistens noch eine Versionsangabe, also api/v1 oder ähnliche Sachen, damit ich neuere Versionen meiner Rest-API entsprechend aussteuern kann. Damit habe ich die Grundlagen gelegt, dass ich jetzt überhaupt RESTful Services definieren kann. Einen RESTful Service lege ich an, indem ich eine neue Klasse definiere. Die liegt bei mir im Package de.video2brain.services.restful.service. Wir nennen sie SimpleRestfulService. Das ist eine ganz normale Klasse. Die bekommt die @Path-Annotation. Hier können wir einen virtuellen Pfadnamen angeben, zum Beispiel simple. Über den ist dann der eigentliche Service erreichbar. Dieser Service soll nun über zwei Methoden verfügen. In der einen Methode wird einfach eine Zeichenkette, die entgegengegeben wurde, nochmal angereichert um einiges an Text. Die zweite Methode wird eine Liste von Objekten zurückgeben. Damit wir das machen können, werden wir zuerst die Objektklasse definieren. Diese Objektklasse liegt im Package de.video2brain.services.models und nennt sich MessageModel. Sie verfügt letztlich über eine einzige Eigenschaft, die dann mit Getters und Setters versehen ist. die Eigenschaft message. Das ist die, die wir letztlich auch per JSON ansprechen werden. Ich füge hier ganz bewusst eine Annotation hinzu, die eigentlich mit JSON nichts zu tun hat, nämlich die @XmlRootElement-Annotation. Die brauche ich, falls ich dieses MessageModel, also diese Instanz, auch nach XML serialisieren möchte. Nach JSON geht immer, aber nach XML, da brauche ich diese @XmlRootElement-Annotation dazu. Damit ist dieses MessageModel schon fertig. Aus Convenience mache ich noch zwei Constructors, einmal den Standard-Constructor und einmal einen, wo ich die Nachricht mit übergebe. Das erleichtert mit die Arbeit später. Damit ist diese Datentransferklasse, das ist nichts anderes, fertig. Jetzt kann ich mich um meinen RESTful Service als solchen kümmern. Zuerst definieren wir die Methode sayHello. Wir geben hier eine neue MessageModel-Instanz zurück. Die nimmt einfach die übergebene Information und ergänzt sie um die Zeichenkette Hello, . Jetzt kennzeichnen wir diese Methode als per GET Request erreichbar, indem wir die @GET-Annotation darüber schreiben. Nun geben wir Auskunft darüber, dass diese Methode in der Lage ist, sowohl XML als auch JSON zu produzieren. Das machen, indem wir hier ein Array von MediaTypes mit angeben. Und zwar einmal APPLICATION_JSON und einmal TEXT_XML. Damit drücken wir aus, dass beide Rückgabevarianten möglich sind. Damit ist die erste Methode fertig. Die zweite Methode wird auch dieses MessageModel entgegegennehmen und darüber hinaus einen Pfadparameter verwenden. Wir geben hier eine Liste vom Typ MessageModel zurück. Die eigentliche Nachricht, die wir übertragen wollen, wird auch über eine MessageModel-Instanz transportiert. Dadurch kann sie als JSON zum Beispiel angeliefert werden. Und es gibt darüber hinaus die Variante repeatCount, die wir an den Pfadparameter binden werden. Diese Methode ist per POST zu erreichen. Sie bekommt einen eigenständigen Pfad übergeben. Sie wird multiple heißen und definiert den Platzhalter count. Diesen Platzhalter count werden wir nun binden über die @PathParam-Annotation, wo wir diesen Parameter direkt mit angeben, an das Feld repeatCount der Methodensignatur. Die Methode muss jetzt noch implementiert werden. Das machen wir relativ einfach, indem wir eine ArrayList erzeugen und dann in einer Vorschleife die Nachrichten generieren lassen. Damit ist im Grunde die Verarbeitung hier fast schon abgeschlossen. Die Rückgabe muss noch generiert werden und dann war es das. Wenn ich jetzt diese Methode auch in die Lage versetzen möchte, dass sie sowohl XML als auch JSON bereitstellt, werde ich der Methode auch die @Produces-Annotation hinzufügen. Damit kann diese Methode sowohl JSON als auch XML zurückgeben. Nun werde ich der Methode sayHello noch einen entsprechenden Pfad geben. Sie soll über den Pfad single erreichbar sein. Als letzten Schritt muss ich die Klasse SimpleRestfulService, die ich definiert habe, als Stateless Bean definieren. Das benötige ich, weil ich sie in einem EJB-Projekt angelegt habe. Wenn ich das Ganze nur in einem Web-Projekt mache, kann ich auf die Angabe von @Stateless hier verzichten. Nun können wir den Service auf dem Server deployen und dann zum Beispiel per Fiddler Tool direkt aufrufen. Hier in Fiddler kann ich über den Composer mit dem Scratchpad HTTP Requests schon fest anlegen und hinterlegen. Ich werde nun ein Request auf die Methode single vornehmen. Wenn ich das aufgerufen habe, sehe ich, dass ich die Rückgabe "Hello, World!" bekomme, und zwar als JSON-Struktur. Mein Request übertrug ja die Zeichenkette "World!". Jetzt ändern wir im Scratchpad den Accept-Header auf text/xml und führen den Call nochmal aus. Diesmal ist die Rückgabe ein XML-Dokument. Analog können wir beim Aufruf der Methode multiple vorgehen. Diese soll nun 10 mal die Rückgabe generieren. Wir rufen sie auf. Und sehen dann, dass wir eine entsprechende JSON-Struktur zurückgegeben bekommen. Auch hier können wir im Composer den Accept-Header hinzufügen. Und nun wird uns eine XML-Struktur zurückgegeben. In diesem Video haben wir uns damit auseinandergesetzt, wie wir einen RESTful Service definieren können, wie wir die Applikation so konfigurieren können, dass der RESTful Service von außen erreichbar ist. Wir haben uns damit auseinandergesetzt, wie wir Rückgabeformate, zum Beispiel JSON oder XML, generieren lassen können. Auch haben wir besprochen, wie wir mit den Annotationen @GET, @POST, @PUT, und @DELETE in der Lage sind, verschiedene HTTP-Methoden auszudrücken. Zuletzt haben wir im Fiddler Tool zwei Calls aufgerufen und dabei unterschiedliche Rückgaben in Form von JSON- beziehungsweise XML-Strukturen generieren lassen.

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!