Transcript
Page 1: Servicios Web Rest con Spring MVC

Servicios  Web  RestFul  

Derechos  reservados  2015    

Page 2: Servicios Web Rest con Spring MVC

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  

Page 3: Servicios Web Rest con Spring MVC

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

Page 4: Servicios Web Rest con Spring MVC

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

Page 5: Servicios Web Rest con Spring MVC

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

Page 6: Servicios Web Rest con Spring MVC

RestFul  

Page 7: Servicios Web Rest con Spring MVC

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  

Page 8: Servicios Web Rest con Spring MVC

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  

Page 9: Servicios Web Rest con Spring MVC

Historia  

S Muchas  empresas  con  amplios  servicios  en  internet  están  migrando  sus  servicios  a  Rest.  S  Amazon  S  Facebook  S  Yahoo  S  Twiter  

Page 10: Servicios Web Rest con Spring MVC

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  

Page 11: Servicios Web Rest con Spring MVC

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  

Page 12: Servicios Web Rest con Spring MVC

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.  

Page 13: Servicios Web Rest con Spring MVC

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.  

Page 14: Servicios Web Rest con Spring MVC

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  

Page 15: Servicios Web Rest con Spring MVC

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.  

Page 16: Servicios Web Rest con Spring MVC

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>

Page 17: Servicios Web Rest con Spring MVC

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()"} ] } }}

Page 18: Servicios Web Rest con Spring MVC

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  

Page 19: Servicios Web Rest con Spring MVC

Web  Applica>on  Descrip>on  Language  (WADL)    

Page 20: Servicios Web Rest con Spring MVC

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.  

Page 21: Servicios Web Rest con Spring MVC

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>  

Page 22: Servicios Web Rest con Spring MVC

Spring  MVC  

Page 23: Servicios Web Rest con Spring MVC

Spring  Framework  

Page 24: Servicios Web Rest con Spring MVC

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  

Page 25: Servicios Web Rest con Spring MVC

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  

Page 26: Servicios Web Rest con Spring MVC

Spring  MVC  

Page 27: Servicios Web Rest con 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  

Page 28: Servicios Web Rest con Spring MVC

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“  

Page 29: Servicios Web Rest con Spring MVC

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  

Page 30: Servicios Web Rest con Spring MVC

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  -­‐-­‐>  

Page 31: Servicios Web Rest con Spring MVC

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>  

Page 32: Servicios Web Rest con Spring MVC

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>  

Page 33: Servicios Web Rest con Spring MVC

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>  

Page 34: Servicios Web Rest con Spring MVC

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  

Page 35: Servicios Web Rest con Spring MVC

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  

Page 36: Servicios Web Rest con Spring MVC

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  

Page 37: Servicios Web Rest con Spring MVC

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  

Page 38: Servicios Web Rest con Spring MVC

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  

Page 39: Servicios Web Rest con Spring MVC

ENLACES  

S  hdp://docs.spring.io/spring-­‐framework/docs/current/spring-­‐framework-­‐reference/html/mvc.html#mvc-­‐introduc;on  

Page 40: Servicios Web Rest con Spring MVC

ENLACES  S  hdp://webservices.xml.com/  S  hdps://blueprints.dev.java.net/books.html  

Page 41: Servicios Web Rest con Spring MVC

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  

Page 42: Servicios Web Rest con Spring MVC