200 likes | 432 Views
JAX-RS (RESTful WS). M.C. Juan Carlos Olivares Rojas. Julio 2011. REST. Es un protocolo más sencillo de manejar los servicios Web, se caracteriza por no manejar SOAP ni WSDL y por lo tanto es más ligero.
E N D
JAX-RS (RESTful WS) M.C. Juan Carlos Olivares Rojas Julio 2011
REST • Es un protocolo más sencillo de manejar los servicios Web, se caracteriza por no manejar SOAP ni WSDL y por lo tanto es más ligero. • Los demás protocolos se siguen conservando. Los Servidores Web deben soportar este tipo de Servicios (ya es muy común)
JAX-RS • REST (Representational State Transfer) • Muchos Servicios Web de la Web 2.0 trabajan bajo este enfoque. • REST está orientado a los recursos. • Utiliza los métodos GET, POST, PUT y DELETE de HTTP.
JAX-RS • Es la API de java para crear Servicios Web basados en la arquitectura REST • Al igual que JAX-WS utiliza anotaciones como: @Path, @GET, @PUT, @DELETE, @HEAD, entre otras.
JAX-RS • La implementación mejor conocida de JAX-RS se denomina Jersey. • Existe un mapeo entre las acciones a realizar y el verbo.
JAX-RS • La descripción de los WS con REST se hace a través de WADL (Web Appliction Description Language), el cual es un archivo basado en XML que contiene las operaciones disponibles y su forma de acceso a través del protocolo HTTP.
Ejemplo 1: SOAP POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?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 xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
Ejemplo 1: REST GET /stock/IBM HTTP/1.1 Host: www.example.org Accept: application/xml
Ejemplo 2: SOAP POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?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 xmlns:m="http://www.example.org/stock"> <m:BuyStock> <m:StockName>IBM</m:StockName> <m:Quantity>50</m:Quantity> </m:BuyStock> </soap:Body> </soap:Envelope>
Ejemplo 2: REST POST /order HTTP/1.1 Host: www.example.org Content-Type: application/xml; charset=utf-8 <?xml version="1.0"?> <order> <StockName>IBM</StockName> <Quantity>50</Quantity> </order>
Acceso a los Recursos • Create • POST /resourceName • Retrieve • GET /resourceName/resourceId • Update • PUT /resourceName/resourceId • Delete • DELETE /resourceName/resourceId
Hola Mundo!!! import javax.ws.rs.Path; import javax.ws.rs.GET; import javax.ws.rs.ProduceMime; @Path("/helloRest") public class HelloRest { @GET @ProduceMime("text/html") public String sayHello() { return "<html><body><h1>Hello from Jersey!</body></h1></html>"; } }
HolaMundo!!! • Este servicio Web se ejecuta simplemente colocando la URL en el navegador. • Si se ocupan pasar parámetros, dichos parámetros se pasan a través de la URI por medio de los verbos HTTP.
Ejemplo de Parametros en URI @Path("/products/{id}") public class ProductResource { @Context private UriInfo context; /** Creates a new instance of ProductResource */ public ProductResource() { } @GET @ProduceMime("text/plain") public String getProduct(@PathParam("id") int productId) { switch (productId) { case 1: return "A Shiny New Bike"; case 2: return "Big Wheel"; case 3: return "Taser: Toddler Edition"; default: return "No such product"; } } }
Como puede observarse, las direcciones de los servicios Web pueden manejar expresiones regulares para simplificar mejor su uso. • También se puede indicar el verbo de ejecución del WS. Expresiones Regulares
@Path(“customer/{name}") public class Customer { @GET String get(@PathParam("name") String name) { … } @PUT Void put(@PathParam(“name”) String name, String value) { … } Parámetros de @Path
@Path("/products/{id: \\d{3}}") public class ProductResource { public ProductResource() { } @GET @Produces("text/plain") public String getProductPlainText(@PathParam("id") int productId) { return "Your Product is: " + productId; } } Correcto: http://localhost:8080/jrs/resources/products/555 Incorrecto (regresa estado 404) http://localhost:8080/jrs/resources/products/7 Ejemplo Expresiones Regulares
Utilizando Cadenas de Búsqueda @GET @Produces("text/xml") public String getProducts( @PathParam("id") int productId, @QueryParam("results") @DefaultValue("5") int numResults) • //…/resources/products?results=3
Acceso a Encabezados @GET public String doGet(@Context HttpHeaders headers) { //list all incoming headers MultivaluedMap<String,String> h = headers.getRequestHeaders(); for (String header : h.keySet()) { System.out.println(header + "=" + h.get(header)); }