04-JAX-RS-Einfuehrung

Werbung
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
Herunterladen