Servicios Web Rest con Spring MVC
-
Upload
vortexbird -
Category
Software
-
view
273 -
download
11
Transcript of Servicios Web Rest con Spring MVC
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>
Spring MVC
Spring Framework
Spring MVC
S Spring MVC es uno de los módulos del framework spring.
S Implementación del patrón modelo vista control S Cuenta con soporte para costruccion de servicios REST
S Modular, simple de usar y configurar. S Es basado en las anotaciones @Controller y @RequestMapping
Spring MVC
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
Spring MVC
Anotaciones Spring MVC
Anotación Descripción
@RequestMapping(method = RequestMethod.GET)
Marca el método como accesible a través del método GET de HTTP
@RequestMapping(method = RequestMethod.POST)
Marca el método como accesible a través del método POST de HTTP
@RequestMapping(method = RequestMethod.PUT)
Marca el método como accesible a través del método PUT de HTTP
@RequestMapping(method = RequestMethod.DELETE)
Marca el método como accesible a través del método DELETE de HTTP
@RequestMapping(method = RequestMethod.HEAD)
Marca el método como accesible a través del método HEAD de HTTP
Anotaciones Spring MVC
Anotación Descripción
@RequestMapping Indica donde queda alojada la clase o el método. Por ejemplo /holaMundo/
@PathVariable Se usa para asignar a los parámetros de los métodos el nombre del path usado.
consumes="applica;on/json"
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"
produce="applica;on/json"
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“
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
Maven 1/2 <!-‐-‐ Jackson JSON Mapper -‐-‐>
<dependency> <groupId>org.codehaus.jackson</groupId> <ar>factId>jackson-‐mapper-‐asl</ar>factId> <version>1.9.13</version> </dependency>
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <ar>factId>jackson-‐core</ar>factId> <version>2.5.1</version> </dependency>
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <ar>factId>jackson-‐databind</ar>factId> <version>2.5.1</version> </dependency>
<!-‐-‐ Jackson JSON Mapper -‐-‐>
Maven 2/2 <proper>es> <spring.version>4.1.5.RELEASE</spring.version> </proper>es>
<dependencies> <dependency> <groupId>org.springframework</groupId> <ar>factId>spring-‐core</ar>factId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <ar>factId>spring-‐web</ar>factId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <ar>factId>spring-‐webmvc</ar>factId> <version>${spring.version}</version> </dependency> </dependencies>
mvc-‐dispatcher-‐servlet.xml
<?xml version='1.0' encoding='UTF-‐8' ?> <beans xmlns="h7p://www.springframework.org/schema/beans"
xmlns:xsi="h7p://www.w3.org/2001/XMLSchema-‐instance" xmlns:context="h7p://www.springframework.org/schema/context" xmlns:mvc="h7p://www.springframework.org/schema/mvc" xsi:schemaLoca;on="h7p://www.springframework.org/schema/mvc h7p://www.springframework.org/schema/mvc/spring-‐mvc-‐4.1.xsd h7p://www.springframework.org/schema/beans h7p://www.springframework.org/schema/beans/spring-‐beans-‐4.1.xsd h7p://www.springframework.org/schema/context h7p://www.springframework.org/schema/context/spring-‐context-‐4.1.xsd">
<context:component-‐scan base-‐package="com.vobi.demo.mvc.controller" /> <mvc:annota;on-‐driven />
</beans>
web.xml <web-‐app>
<listener> <listener-‐class>org.springframework.web.context.ContextLoaderListener</listener-‐class> </listener>
<listener> <listener-‐class>org.springframework.web.context.request.RequestContextListener</listener-‐class> </listener>
<context-‐param> <param-‐name>contextConfigLoca>on</param-‐name> <param-‐value>classpath*:/applica>onContext.xml,classpath*:/mvc-‐dispatcher-‐servlet.xml</param-‐value> </context-‐param> <!-‐-‐ MVC -‐-‐> <servlet> <servlet-‐name>mvc-‐dispatcher</servlet-‐name> <servlet-‐class>org.springframework.web.servlet.DispatcherServlet</servlet-‐class> <load-‐on-‐startup>1</load-‐on-‐startup> </servlet>
<servlet-‐mapping> <servlet-‐name>mvc-‐dispatcher</servlet-‐name> <url-‐pajern>/controller/*</url-‐pajern> </servlet-‐mapping> <!-‐-‐ MVC à
</web-‐app>
Código de ejemplo Servicio
@Controller @RequestMapping("/operacionesMatema>cas") public class OperacionesMatema>cas {
@RequestMapping(value="/sumar/{numeroUno}/{numeroDos}", method = RequestMethod.GET) public @ResponseBody Resultado sumar(@PathVariable Integer numeroUno, @PathVariable Integer
numeroDos,ModelMap model) { Resultado resultado=new Resultado(); resultado.setResultado(numeroUno+numeroDos); return resultado; }
}
hdp://127.0.0.1:8080/demoRestSpringMVC/controller/operacionesMatema;cas/sumar/3/4
Código de ejemplo Cliente
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfigura;on("/applica;onContext.xml") public class ClienteOperacionesMatema>cas {
@Test public void test() { RestTemplate restTemplate = new RestTemplate(); Resultado resultado=restTemplate.getForObject("hdp://127.0.0.1:8080/demoRestSpringMVC/
controller/operacionesMatema;cas/sumar/3/4",Resultado.class); assertEquals(resultado.getResultado(), new Integer(7)); System.out.println(resultado.getResultado()); }
}
hdp://127.0.0.1:8080/demoRestSpringMVC/controller/operacionesMatema;cas/sumar/3/4
WADL de ejemplo
<?xml version="1.0" encoding="UTF-‐8" standalone="yes"?> <applica>on xmlns="hjp://research.sun.com/wadl/2006/10"> <doc xmlns:jersey="hjp://jersey.dev.java.net/" jersey:generatedBy="Jersey: 1.0.3.1 08/14/2009 04:19 PM"/> <resources base="hjp://127.0.0.1:9090/demoRest/services/"> <resource path="operacionesMatema>cas"> <resource path="sumar/{numero_uno}/{numero_dos}"> <param xmlns:xs="hjp://www.w3.org/2001/XMLSchema" type="xs:int" style="template" name="numero_uno"/> <param xmlns:xs="hjp://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 Operaciones Matema;cas
Taller desarrollo de servicios Rest
S Servicio de En;dad para Cliente S Crear S Modificar S Borrar S Consultar por ID S Consultar Todos
S Cliente del servicio Rest
ENLACES
S hdp://docs.spring.io/spring-‐framework/docs/current/spring-‐framework-‐reference/html/mvc.html#mvc-‐introduc;on
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