jax-rs javaone hyderabad, india 2011
TRANSCRIPT
![Page 1: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/1.jpg)
<Insert Picture Here>
Developing RESTful Web services with JAX-RS
Shreedhar Ganapathy, Arun Gupta, Java EE & GlassFish Guys
![Page 2: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/2.jpg)
2
The following/preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions.The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.
![Page 3: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/3.jpg)
3
What is REST• REST stands for Representational State Transfer.
• Relies on a stateless, client-server, cacheable communications protocol
• In most cases, the HTTP protocol is used to make calls between two or more network endpoints
• Lightweight alternative to mechanisms like CORBA, RPC and Web Services (SOAP, WSDL, etc. )
• REST uses HTTP for all four CRUD (Create / Read / Update / Delete) operations
![Page 4: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/4.jpg)
4
REST is an Architectural Style
Style of software architecture for designing distributed and networked hypermedia systems such as World
Wide Web
![Page 5: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/5.jpg)
5
RESTful Web Services
Application of REST architectural style to services that utilize Web standards (URIs, HTTP, HTML, XML, Atom, RDF etc.) that are Platform and Language
independent
![Page 6: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/6.jpg)
6
Java API for RESTful Web Services (JAX-RS)
Standard annotation-driven API that aims to help developers build RESTful
Web services in Java
![Page 7: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/7.jpg)
7
How does REST compare with SOAP?SOAP Request The following query is sent as an HTTP POST
Result response is usually an XML document embedded in an envelope
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:body pb="http://www.example.com/customerdb">
<pb:GetCustomerAddress> <pb:CustID>4545</pb:CustID>
</pb:GetCustomerAddress>
</soap:Body>
</soap:Envelope>
REST Query
The following URL is sent to server with a GET request
The response is raw result data that can be directly consumed without opening an envelope
http://www.example.com/customerdb/CustomerAddress/4545
![Page 8: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/8.jpg)
8
RESTful Application Cycle
Resources are identified by URIs
↓
Clients communicate with resources via requests using a standard set of methods
↓
Requests and responses contain resource representations in formats identified by media types
↓
Responses contain URIs that link to further resources
![Page 9: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/9.jpg)
9
Principles of REST
• Give everything an ID• Standard set of methods• Link things together• Multiple representations• Stateless communications
![Page 10: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/10.jpg)
10
Give Everything an ID
• ID is a URI
http://example.com/widgets/foo
http://example.com/customers/bar
http://example.com/customers/bar/orders/2
http://example.com/orders/101230/customer
![Page 11: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/11.jpg)
11
Resources are identified by URIs
• Resource == Java class• POJO• No required interfaces
• ID provided by @Path annotation• Value is relative URI, base URI is provided by deployment
context or parent resource• Embedded parameters for non-fixed parts of the URI• Annotate class or “sub-resource locator” method
![Page 12: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/12.jpg)
12
Resources are identified by URIs
@Path("orders/{order_id}")
public class OrderResource {
@GET
@Path("customer")
CustomerResource getCustomer(@PathParam(“order_id”)int id) {...}
}
![Page 13: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/13.jpg)
13
Standard Set of Methods
PurposeMethod
RemoveDELETE
Update or create with a known IDPUT
Update or create without a known IDPOST
Read, possibly cachedGET
![Page 14: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/14.jpg)
14
Standard Set of Methods
• Annotate resource class methods with standard method• @GET, @PUT, @POST, @DELETE, @HEAD
• @HttpMethod meta-annotation allows extensions, e.g. WebDAV
• JAX-RS routes request to appropriate resource class and method
• Flexible method signatures, annotations on parameters specify mapping from request
• Return value mapped to response
![Page 15: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/15.jpg)
15
@Path("properties/{name}")public class SystemProperty {
@GET Property get(@PathParam("name") String name) {...}
@PUT Property set(@PathParam("name") String name, String value) {...}
}
Standard Set of Methods
![Page 16: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/16.jpg)
16
Multiple Representations• Offer data in a variety of formats
• XML (Type safety advantage)• JSON (easy to parse with JavaScript clients)• (X)HTML (Ideal for clients like browsers for human readable
documents)
• Maximize reach• Support content negotiation
• Accept headerGET /fooAccept: application/json
• URI-basedGET /foo.json
![Page 17: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/17.jpg)
17
Resource Representations
• Representation format identified by media type. E.g.:• XML - application/properties+xml• JSON - application/properties+json• (X)HTML+microformats - application/xhtml+xml
• JAX-RS automates content negotiation• GET /fooAccept: application/properties+json
![Page 18: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/18.jpg)
18
Multiple Representations
• Static - Annotate methods or classes with static capabilities• @Produces, @Consumes
• Dynamic - Use Variant, VariantListBuilder and Request.selectVariant for dynamic capabilities
![Page 19: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/19.jpg)
19
Content Negotiation: Accept Header
@GET@Produces({"application/xml","application/json"})Order getOrder(@PathParam("order_id") String id) { ...}
@GET@Produces("text/plain")String getOrder2(@PathParam("order_id") String id) { ...}
Accept: application/xmlAccept: application/json;q=1.0, text/plain;q=0.5, application/xml;q=0.5,
![Page 20: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/20.jpg)
20
Content Negotiation: URL-based
@Path("/orders")
public class OrderResource {
@Path("{orderId}.xml") @Produces(“application/xml”) @GET public Order getOrderInXML(@PathParam("orderId") String orderId) {
. . . }
@Path("{orderId}.json") @Produces(“application/json”) @GET public Order getOrderInJSON(@PathParam("orderId") String orderId) {
. . . }
}
![Page 21: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/21.jpg)
21
JAX-RS 1.1Code Sample
import javax.inject.Inject;import javax.enterprise.context.RequestScoped;
@RequestScopedpublic class ActorResource { @Inject DatabaseBean db;
public Actor getActor(int id) { return db.findActorById(id); }}
![Page 22: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/22.jpg)
22
Content Negotiation
import javax.inject.Inject;import javax.enterprise.context.RequestScoped;
@RequestScopedpublic class ActorResource { @Inject DatbaseBean db;
public Actor getActor( int id) { return db.findActorById(id); }}
import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.PathParam;
@Path("/actor/{id}")
@GET @Produces("application/json") @PathParam("id")
http://blogs.sun.com/arungupta/entry/totd_124_using_cdi_jpa
![Page 23: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/23.jpg)
23
Link Things Together
<order self="http://example.com/orders/101230"> <customer ref="http://example.com/customers/bar"> <product ref="http://example.com/products/21034"/> <amount value="1"/></order>
![Page 24: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/24.jpg)
24
Responses Contain Links
HTTP/1.1 201 CreatedDate: Wed, 03 Jun 2009 16:41:58 GMTServer: Apache/1.3.6Location: http://example.com/properties/fooContent-Type: application/order+xmlContent-Length: 184
<property self="http://example.com/properties/foo"> <parent ref="http://example.com/properties/bar"/> <name>Foo</name> <value>1</value></order>
![Page 25: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/25.jpg)
25
Responses Contain Links
• UriInfo provides information about deployment context, the request URI and the route to the resource
• UriBuilder provides facilities to easily construct URIs for resources
![Page 26: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/26.jpg)
26
Responses Contain Links
@Context UriInfo i;
SystemProperty p = ...UriBuilder b = i.getBaseUriBuilder();URI u = b.path(SystemProperties.class) .path(p.getName()).build();
List<URI> ancestors = i.getMatchedURIs();URI parent = ancestors.get(1);
![Page 27: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/27.jpg)
27
Stateless Communications
• Long lived identifiers• Avoid sessions• Everything required to process a request
contained in the request
![Page 28: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/28.jpg)
28
JAX-RS 1.1More Code Samples
• Processing POSTed HTML Form@POST@Consumes("application/x-www-form-urlencoded")public void post(@FormParam("name") String name) { // Store the message}
• Sub-Resources@Singleton@Path("/printers")public class PrintersResource {
@GET @Path("/list") @Produces({"application/json", "application/xml"}) public WebResourceList getListOfPrinters() { ... }
@GET @Path("/ids/{printerid}") @Produces({"application/json", "application/xml"}) public Printer getPrinter(@PathParam("printerid") String printerId) { ... }
![Page 29: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/29.jpg)
29
JAX-RS 1.1Integration with Java EE 6 – Servlets 3.0
• No or Portable “web.xml”<web-app>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.foo.MyApplication</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
</web-app>
public class MyApplication extends javax.ws.rs.core.Application {
}
@ApplicationPath(“resources”)
![Page 30: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/30.jpg)
30
JAX-RS Summary
• Java API for building RESTful Web Services• POJO based• Annotation-driven• Server-side API• HTTP-centric
![Page 31: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/31.jpg)
31
JAX-RS 1.1Integration with Java EE 6 – EJB 3.1
• Use stateless or singleton EJBs in the WAR as resource and provider classes
@Singleton
public class MyStatelessResource {
…
}
@Context UriInfo ui;
@Stateless
public class MyStatelessRootResource {
public String get() { return “GET”; }
@EJB MyStatelessResource subResource;
public MyStatelessResource sub() {
return subResource;
}
}
@Path(“stateless”)
@Context UriInfo ui;
@GET
@Path(“sub-resource”)
![Page 32: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/32.jpg)
32
JAX-RS 1.1Jersey Client-side API
• Consume HTTP-based RESTful Services• Easy-to-use
• Better than HttpURLConnection!
• Reuses JAX-RS API• Resources and URI are first-class citizens
• Not part of JAX-RS yet• com.sun.jersey.api.client
![Page 33: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/33.jpg)
33
JAX-RS 1.1Jersey Client API – Code Sample
Client client = Client.create();
WebResource resource = client.resource(“...”);
//curl http://example.com/baseString s = resource.get(String.class);
//curl -HAccept:text/plain http://example.com/baseString s = resource. accept(“text/plain”). get(String.class);
http://blogs.sun.com/enterprisetechtips/entry/consuming_restful_web_services_with
![Page 34: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/34.jpg)
34
JAX-RS 1.1Jersey Client API – NetBeans Code Generation
![Page 35: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/35.jpg)
35
JAX-RS 1.1WADL Representation of Resources
• Machine processable description of HTTP-based Applications
• Generated OOTB for the application<application xmlns="http://research.sun.com/wadl/2006/10"> <doc xmlns:jersey="http://jersey.dev.java.net/" jersey:generatedBy="Jersey: 1.1.4.1 11/24/2009 01:37 AM"/> <resources base="http://localhost:8080/HelloWADL/resources/">
<resource path="generic"> <method id="getText" name="GET"> <response> <representation mediaType="text/plain"/> </response> </method> <method id="putText" name="PUT"> <request> <representation mediaType="text/plain"/> </request> </method> </resource> </resources> </application>
![Page 36: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/36.jpg)
36
Java SE Deployment
• RuntimeDelegate is used to create instances of a desired endpoint class
• Application supplies configuration information
• List of resource classes and providers as subclass of Application
• Implementations can support any Java type• Jersey supports Grizzly (see below), LW HTTP server and JAX-WS
Provider
![Page 37: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/37.jpg)
37
Example Java SE Deployment
Application app = ...RuntimeDelegate rd = RuntimeDelegate.getInstance();Adapter a = rd.createEndpoint(app, Adapter.class);
SelectorThread st = GrizzlyServerFactory.create( “http://127.0.0.1:8084/”, a);
![Page 38: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/38.jpg)
38
Servlet• JAX-RS application packaged in WAR like a servlet
• For JAX-RS aware containers• web.xml can point to Application subclass
• For non-JAX-RS aware containers• web.xml points to implementation-specific Servlet; and
• an init-param identifies the Application subclass
• Resource classes and providers can access Servlet request, context, config and response via injection
![Page 39: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/39.jpg)
39
JAX-RS status
• JAX-RS 1.0: 18th October 2008• JAX-RS 1.1: 23rd November 2009
• Aligned with Java EE 6, but not in the Web profile!
• JAX-RS 2.0: JSR 339 Filed • Implementations
• Apache CXF, Apache Wink, eXo, Jersey, RESTEasy, Restlet, Triaxrs
39
![Page 40: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/40.jpg)
40
GET /Samples
• Many samples are provided with the release• Atom, JAXB, JSON, Scala, Spring, WADL
• Using GlassFish (+embedded) and Grizzly• Download the 1.1.0 samples
• Samples are maven-based• Works with NetBeans 6.x + maven plugin• Individual sample zip files are also available
• e.g. Sparklines, Mandel
![Page 41: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/41.jpg)
41
GET /Features
• Client API • JSON with JAXB• Spring and Guice integration• MIME multipart API• Atom with Abdera API• WADL• Grizzly and Simple servers
![Page 42: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/42.jpg)
42
JAX-RS 2.0http://jcp.org/en/jsr/detail?id=339
● Client API● Low level using Builder pattern, Higher-level
● Hypermedia● MVC Pattern
● Resource controllers, Pluggable viewing technology● Bean Validation
● Form or Query parameter validation● Closer integration with @Inject, etc.● Server-side asynchronous request processing● Server-side content negotiation
NEW
![Page 43: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/43.jpg)
43
References
• oracle.com/javaee• glassfish.org• oracle.com/goto/glassfish• blogs.sun.com/theaquarium• youtube.com/GlassFishVideos• Follow @glassfish
![Page 44: JAX-RS JavaOne Hyderabad, India 2011](https://reader034.vdocuments.us/reader034/viewer/2022052315/554f839db4c9052a518b4df8/html5/thumbnails/44.jpg)
<Insert Picture Here>
Developing RESTful Web services with JAX-RS
Shreedhar Ganapathy, Arun Gupta, Java EE & GlassFish Guys
blogs.sun.com/arungupta, @arungupta