servicios rest con jersey
TRANSCRIPT
Servicios Web RestFul
Derechos reservados 2015
Que es un WebService?
S Un WebService es una pieza de so9ware iden;ficada por un URI (Uniform Resource Iden;fier).
S Su medio de comunicación se fundamenta en el uso de XML, TEXT, JSON
S XML S XML Namespace, XML Schema, Xpath, XSLT. S HTTP, JSON
Computación distribuida
Client-Server(C/S) silos
Web-based computing
Servers
Clients
Clients
Servers
Internet
PDA Cell Phone
Server
Laptop Kiosk
Workstation
Web Services/Peer-to-Peer
SOA computing
Tradicional C/S vs. Servicios Web
Within enterprise Tied to a set of
programming languages Procedural Usually bound to a
particular transport Tightly-coupled Efficient processing
(space/time)
Between enterprises Program language
independent Message-driven Easily bound to different
transports Loosely-coupled Relatively not efficient
processing
Traditional C/S Web Service
Web Applica>on vs. Web Services
User-to-program interaction
Static integration of components
Monolithic service
Program-to-program interaction Possibility of dynamic
integration of components (in the future) Possibility of service
aggregation (in the future)
Web Application Web Service
RestFul
Historia
S Transferencia de Estado Representacional (Representa;onal State Transfer) o REST
S Originado en el año 2000 por el doctor Roy Fielding en la Universidad de California en su tesis doctoral
S Tesis “Es;los de Arquitectura y el Diseño de Arquitecturas de So9ware basadas en Redes”
S Principios arquitectónicos de so9ware para usar a la Web como una plataforma de Procesamiento Distribuido
Historia
S U;liza XML y HTTP, sin las abstracciones adicionales de los protocolos basados en patrones de intercambio de mensajes como el protocolo de servicios web SOAP.
S Se hizo popular muchos años después con la creación de varios framework que hacen fácil el desarrollo de servicios RestFul
Historia
S Muchas empresas con amplios servicios en internet están migrando sus servicios a Rest. S Amazon S Facebook S Yahoo S Twiter
Los 4 principios de Rest
S U;liza los métodos HTTP de manera explícita S No man;ene estado S Expone URIs con forma de directorios S Transfiere XML, JavaScript Object Nota;on (JSON), o ambos
Uso de métodos HTTP de manera explícita
S RestFul usa de forma explicita los métodos HTTP para ejecutar acciones de CRUD
Verbo REST Acción
POST Create
GET Read
PUT Update
DELETE Delete
No man>ene estado
S Basado en el protocolo HTTP sin estado. S Servicios mas simples de diseñar, escribir y reu;lizar. S El manejo de los estados debe ser hecho por el cliente de los servicios.
Expone URIs con forma de directorios
S Las URI de los servicios Rest deben ser intui;vas. S Se deben poder deducir de forma fácil. S Las URI se definen como una estructura de carpetas o directorios.
Expone URIs con forma de directorios
S Direcciones de un blog – hdp://www.vortexbird.org/discusion/temas/{tema} – hdp://www.vortexbird.org/discusion/{año}/{mes}/{dia}/{tema} – hdp://www.vortexbird.org/discusion/2008/12/23/javaEE
Expone URIs con forma de directorios
S Buenas prac;cas para crear URIs para servicios Rest S Ocultar la tecnología usada en el servidor que aparecería como
extensión de archivos (.jsp, .php, .asp), de manera de poder portar la solución a otra tecnología sin cambiar las URI.
S Mantener todo el uri en minúsculas. S Sus;tuir los espacios con guiones o guiones bajos (uno u otro). S Evitar el uso de strings de consulta. S En vez de usar un 404 Not Found si la pe;ción es una URI
parcial, devolver una página o un recurso predeterminado como respuesta.
S URI está;co deforma que los usuarios puedan crear favoritos" o bookmarks.
Transfiere XML, JSON o ambos S XML: eXtensible Markup Language
<menu id="file" value="File"> <popup> <menuitem value="New" onclick="CreateNewDoc()" /> <menuitem value="Open" onclick="OpenDoc()" /> <menuitem value="Close" onclick="CloseDoc()" /> </popup> </menu>
Transfiere XML, JSON o ambos S JSON: JavaScript Object Nota;on
{"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } }}
Transfiere XML, JSON o ambos S Tipos MIME más usados para los servicios web REST son:
MIME-‐Type Content-‐Type
JSON applica;on/json
XML applica;on/xml
XHTML applica;on/xhtml+xml
TEXT text/plain
Web Applica>on Descrip>on Language (WADL)
Web Applica>on Descrip>on Language (WADL)
S Formato XML usado para la descripción de aplicaciones Web basadas en HTTP.
S El propósito de WADL es describir los servicios Rest o cualquier si;o web.
S Cumple un papel similar a WSDL para servicios SOAP. S Estándar administrado por W3C.
Web Applica>on Descrip>on Language (WADL) • Yahoo news search
01 <?xml version="1.0" standalone="yes"?> 02 <applica;on targetNamespace="urn:yahoo:yn" 03 xmlns:xsi="hdp://www.w3.org/2001/XMLSchema-‐instance" 04 xmlns:xsd="hdp://www.w3.org/2001/XMLSchema" 05 xmlns:yn="urn:yahoo:yn" 06 xmlns:tns="urn:yahoo:yn" 07 xmlns:ya="urn:yahoo:api" 08 xmlns="hdp://research.sun.com/wadl"> 09 ………. 23 <opera;on name="NewsSearch" method="get"> 24 <request> 25 <parameter name="appid" type="xsd:string" required="true"/> 26 <parameter name="query" type="xsd:string" required="true"/> 27 <parameter name="type" type="xsd:string"/> 28 <parameter name="results" type="xsd:int"/> 29 <parameter name="start" type="xsd:int"/> 30 <parameter name="sort" type="xsd:string"/> 31 <parameter name="language" type="xsd:string"/> 32 </request> 33 <response> 34 <representa;on mediaType="text/xml" element="yn:ResultSet"> 35 <parameter name="totalResults" 36 type="xsd:nonNega;veInteger" 37 path="/ResultSet/@totalResultsAvailable"/> 38 <parameter name="resultsReturned" 39 type="xsd:nonNega;veInteger" 40 path="/ResultSet/@totalResultsReturned"/> 41 <parameter name="resultPosi;on" 42 type="xsd:nonNega;veInteger" 43 path="/ResultSet/@firstResultPosi;on"/> 44 <parameter name="results" path="/ResultSet/Result"/> 45 </representa;on> 46 <fault name="SearchError" status="400" 47 mediaType="text/xml" element="ya:Error"> 48 <parameter name="msg" path="/Error/Message" 49 type="xsd:string"/> 50 </fault> 51 </response> 52 </opera;on> 53</applica;on>
JAX-‐RS
JAX-‐RS
S Especificación para desarrollo de servicios Rest en la plataforma JavaEE
S Versión actual JAX-‐RS 1.1 S JSR 311 S Integrada a JavaEE6 S Anotaciones para exposición de servicios. S Es el equivalente de JAX-‐WS para SOAP
JAX-‐RS S Implementaciones de referencia.
– Jersey (Sun Oracle) – CXF (Apache) – RESTEasy (Jboss)
JAX-‐RS
S Basados en el concepto de POJO (Plain Old Java Object) S Clases sin extends ni implements (Mar;n Fowler) S Término heredado de C/C++: Plain Old Data (POD) S Tiene sen;do, son clases de datos
Anotaciones JAX-‐RS
Anotación Descripción
@GET Marca el método como accesible a través del método GET de HTTP
@POST Marca el método como accesible a través del método POST de HTTP
@PUT Marca el método como accesible a través del método PUT de HTTP
@DELETE Marca el método como accesible a través del método DELETE de HTTP
@HEAD Marca el método como accesible a través del método HEAD de HTTP
Anotaciones JAX-‐RS Anotación Descripción
@Path Indica donde queda alojada la clase o el método. Por ejemplo /holaMundo/
@PathParam Se usa para asignar a los parámetros de los métodos el nombre del path usado.
@Consumes Se usa para iden;ficar el ;po de mime que consume el método u operación del servicios. Ejemplos "applica;on/xml", "applica;on/json"
@Produces Se usa para iden;ficar el ;po de mime que produce el método u operación del servicios. Ejemplos "applica;on/xml", "applica;on/json“
@Provider Se usa para crear una clase especializada que representan en;ty body. Estas clases implementan MessageBodyReader or MessageBodyWrite
Tipos de datos soportados Tipo de dato Java Mime Type
byte[] All media types (*/*)
ava.lang.String All text media types (text/*)
java.io.InputStream All media types (*/*)
java.io.Reader All media types (*/*)
java.io.File All media types (*/*)
javax.ac;va;on.DataSource All media types (*/*)
javax.xml.transform.Source XML media types (text/xml, applica;on/xml, and applica;on/*+xml)
javax.xml.bind.JAXBElement and applica;on-‐supplied JAXB classes
XML media types (text/xml, applica;on/xml, and applica;on/*+xml)
Mul;valuedMap<String, String> Form content (applica;on/x-‐www-‐form-‐urlencoded)
StreamingOutput All media types (*/*), MessageBodyWriter only
Código de ejemplo
package com.vortexbir.rest.services; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Consumes({"applica;on/xml", "applica;on/json","text/plain"}) @Produces({"applica;on/xml", "applica;on/json","text/plain"}) @Path("operacionesMatema;cas") public class OperacionesMatema>cas {
@GET @Path("sumar/{numero_uno}/{numero_dos}") public String sumar(@PathParam("numero_uno")Integer n1,@PathParam("numero_dos")Integer n2){ int res=n1+n2; return ""+res; }
}
hdp://127.0.0.1:8080/demoRest/services/operacionesMatema;cas/sumar/52/6
web.xml jersey
<web-‐app xmlns="hgp://java.sun.com/xml/ns/javaee" version="3.0" xmlns:xsi="hgp://www.w3.org/2001/XMLSchema-‐instance" xsi:schemaLoca>on="hgp://java.sun.com/xml/ns/javaee hgp://java.sun.com/xml/ns/javaee/web-‐app_3_0.xsd"> <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-‐pagern>/services/*</url-‐pagern> </servlet-‐mapping> </web-‐app>
WADL de ejemplo
<?xml version="1.0" encoding="UTF-‐8" standalone="yes"?> <applica>on xmlns="hgp://research.sun.com/wadl/2006/10"> <doc xmlns:jersey="hgp://jersey.dev.java.net/" jersey:generatedBy="Jersey: 1.0.3.1 08/14/2009 04:19 PM"/> <resources base="hgp://127.0.0.1:9090/demoRest/services/"> <resource path="operacionesMatema>cas"> <resource path="sumar/{numero_uno}/{numero_dos}"> <param xmlns:xs="hgp://www.w3.org/2001/XMLSchema" type="xs:int" style="template" name="numero_uno"/> <param xmlns:xs="hgp://www.w3.org/2001/XMLSchema" type="xs:int" style="template" name="numero_dos"/> <method name="GET" id="sumar"> <response> <representa>on mediaType="applica>on/xml"/> <representa>on mediaType="applica>on/json"/> <representa>on mediaType="text/plain"/> </response> </method> </resource> </resource> </resources> </applica>on>
hdp://127.0.0.1:8080/demoRest/services/applica;on.wadl hdp://127.0.0.1:8080/demoRest/operacionesMatema;cas/services?_wadl hdp://127.0.0.1:8080/demoRest/operacionesMatema;cas/resources/applica;on.wadl
Taller desarrollo de servicios Rest
S Servicio Operaciones Matemá;cas S Sumar S Restar S Mul;plicar S Dividir
S Cliente del servicio
Taller desarrollo de servicios Rest
S Servicio Cliente S Crear S Modificar S Borrar S Consultar por ID S Consultar Todos
S Cliente del servicio
ENLACES
S hdp://jersey.java.net/ S hdps://addons.mozilla.org/es-‐ES/firefox/addon/poster/
S hdp://www.w3.org/Submission/wadl/ S hdp://www.w3.org/Submission/2009/03/Comment
S hdp://www.ibm.com/developerworks/webservices/library/ws-‐restwsdl/
S hdp://wadl.java.net/
ENLACES S hdp://webservices.xml.com/ S hdps://blueprints.dev.java.net/books.html
Información de contacto
S Si;o Web: www.vortexbird.com S Blog: hdp://blog.vortexbird.com S Contacto vía mail: [email protected] S Teléfonos: +57 -‐ (316 482 4629) S Cali, Colombia