Enterprise-IT-Praktikum JAX-RS-Einführung Institut für Telematik Universität zu Lübeck Wintersmester 2012/13 Dennis Boldt David Gregorczyk Institut für Telematik | Enterprise-IT-Praktikum Wer kennt es nicht – ROA • ROA steht für Resource-oriented Architecture Counterpart: Service-oriented Architecture (SOA) • Roy Fielding: Representational State Transfer (ReST) • Konzept: über Hyperlinks (URIs) werden Ressourcen bereitgestellt und/oder miteinander verknüpft – – – – – Adressierbarkeit Unterschiedliche Repräsentationen Zustandslosigkeit Wohldefinierte Zugriffsoperationen Hypermedia • Wie komisch, passt ja perfekt zu HTTP… Enterprise-IT-Praktikum – JAX-RS-Einführung 2 Institut für Telematik | Enterprise-IT-Praktikum Gibt’s da auch was von Ratiopharm? • Nein, aber von Java: JSR-311 Java API for RESTful Web Services (JAX-RS) • Reference Implementation „Jersey“ • Subprojekt vom GlassFish-Application-Server • http://jersey.java.net • Unterstützt die Konstruktion von REST-konformen Schnittstellen mit Hilfe von Java-Annotationen • JAX-RS 1.1 fertiggestellt • Version 2.0 ist im Bearbeitungsstatus Enterprise-IT-Praktikum – JAX-RS-Einführung 3 Institut für Telematik | Enterprise-IT-Praktikum Vorgehen Server-Seite • Klassen mit Funktionalität programmieren • Annotationen einfügen • Web-Server-Deployment durchführen Client-Seite • Testen z.B. mit curl auf Kommandozeile: curl –HAccept:application/json http://localhost:8080/rest/hello • Browser-Plugin: XHR-Poster • Jersey-Client-API Enterprise-IT-Praktikum – JAX-RS-Einführung 4 Institut für Telematik | Enterprise-IT-Praktikum Server-Seite: Klassen programmieren public class HelloResource // Name beliebig { public String sayProst() // Name beliebig { return "Prost"; } } Enterprise-IT-Praktikum – JAX-RS-Einführung 5 Institut für Telematik | Enterprise-IT-Praktikum Server-Seite: Annotationen einfügen @Path("/hello") public class HelloResource //Name beliebig { @GET @Produces(MediaType.TEXT_PLAIN) public String sayProst() //Name beliebig { return "Prost"; } } Enterprise-IT-Praktikum – JAX-RS-Einführung 6 Institut für Telematik | Enterprise-IT-Praktikum Deployment: Servlet-Container mit Tomcat <web-app …> <servlet> <servlet-name>ServletAdaptor</servlet-name> <servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ServletAdaptor</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> </web-app> Enterprise-IT-Praktikum – JAX-RS-Einführung 7 Institut für Telematik | Enterprise-IT-Praktikum Deployment: Java NIO mit Grizzly URI baseUri = UriBuilder.fromUri("http://localhost/rest").port(9998).build(); ResourceConfig rc = new PackagesResourceConfig("pkg.to.resources"); HttpServer srv = GrizzlyServerFactory.createHttpServer(baseUri, rc); System.in.read(); srv.stop(); Quelle: Jersey Documentation http://jersey.java.net/nonav/documentation/latest/userguide.html#d4e54 Enterprise-IT-Praktikum – JAX-RS-Einführung 8 Institut für Telematik | Enterprise-IT-Praktikum Da geht noch was… • Ein- und Ausgabeparameter • Sub-resources-Konzept für strukturierten RessourcenZugriff • Automatisches Marshalling/Unmarshalling von JavaObjekten zu XML/JSON sehr elegant z.B. mit JAXB Enterprise-IT-Praktikum – JAX-RS-Einführung 9 Institut für Telematik | Enterprise-IT-Praktikum Ein- und Ausgabeparameter @Path("/users") public class UserResource { @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public String createUser(String userData) { ... } @GET @Path("{userid}") @Produces(MediaType.APPLICATION_JSON) public String getUser(@PathParam("userid") String userId) { ... } } Enterprise-IT-Praktikum – JAX-RS-Einführung 10 Institut für Telematik | Enterprise-IT-Praktikum Das Sub-resources-Konzept @Path("/rest") public class RestResource { @Path("users") public String userSubresource(String userData) { return new UserResource(); } } public class UserResource { ... } • Sub-sub-Resources, Sub-sub-sub-Resources usw. möglich • Sub-Resources erhalten KEINE Kontextinformationen Enterprise-IT-Praktikum – JAX-RS-Einführung 11 Institut für Telematik | Enterprise-IT-Praktikum Automatisches Marshalling/Unmarshalling (1/2) • Ein-/Ausgabe-Parameter standardmäßig Strings… • Automatische Transformation wünschenswert • JAXB • XML-zu-Java-Objekt-Mapping-Spezifikation, JSR-222 • http://jaxb.java.net/ • Kann in Zusammenhang mit Jersey eingesetzt werden • Sowohl für XML als auch für JSON • Statt Strings werden in den Resource-Definitionen die JAXB-Beans angegeben • Vorteil mit Hibernate: gemeinsame Klassen für Persistenz und Serialisierung möglich Enterprise-IT-Praktikum – JAX-RS-Einführung 12 Institut für Telematik | Enterprise-IT-Praktikum Automatisches Marshalling/Unmarshalling (2/2) // JAXB-Bean @XmlRootElement public class User { private String userName; private String password; } // JAX-RS-Ressource – Parameter und Rückgabe sind User-Objekte @Path("/users") public class UserResource { @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public User createUser(User userData) { ... } } Enterprise-IT-Praktikum – JAX-RS-Einführung 13