Continuando con el tema de los servicios web, en este post voy a hacer una introducción a REST. Os prometo que este será breve (para mis estándares) y en próximos post nos metemos más en detalle. Lo primero es aclarar que REST no es una tecnología, ni siquiera una arquitectura, sino una familia de arquitecturas. Cualquier arquitectura de servicios distribuidos que cumpla con una serie de requisitos se puede considerar como una arquitectura REST. Estos requisitos o propiedades son los siguientes:
- No se publican servicios RPC. En arquitecturas REST, los servicios no publican un conjunto arbitrario de métodos u operaciones. Por ejemplo, en REST no podemos publicar una interfaz «IGestionEmpleados» con métodos «addEmpleado», «removeEmpleado» o «buscarEmpleadosEnEdadDeJubilacion».
- En REST lo que se publica son recursos. Un recurso se puede considerar como una entidad que representa un concepto de negocio que puede ser accedido públicamente. Un ejemplo de recurso sería simplemente «EmpleadosDeLaEmpresa» y otro podría ser «Empleado número 33»
- Cada recurso, como buena entidad que se precie, y de acuerdo a los principios de OO, posee un identificador único y global, que lo distingue de cualquier otro recurso, aunque ambos tuvieran exactamente los mismos datos. En el caso de «Empleado 33», este sería diferente de «Empleado 40», aunque tuvieran el mismo nombre, sueldo, etc.
- Cada recurso posee un estado interno, que no puede ser accedido directamente desde el exterior. Lo que sí es accesible desde el exterior es una o varias representaciones de dicho estado. Por representación se entiende un formato de datos concreto usado para la transferencia de una copia del estado público del recurso entre el cliente y el servidor. La implementación del recurso decide que información es visible o no desde el exterior, y que representaciones de dicho estado se soportan. Una representación de «Empleado 33» podría ser un documento XML con la información accesible de este. Otra representación sería un documento HTML y otra podría ser un JSON. No sólo podemos representar el recurso como datos estructurados, hay que echarle imaginación. Podríamos pedir por ejemplo, una representación en formato imagen PNG del recurso, tal vez esto devolvería una foto del empleado, o un gráfico de su productividad o su huella dactilar.
- Si no podemos definir operaciones arbitrarias sobre el recurso, ¿cómo podemos operar con él? En REST todos los recursos comparten una interfaz única y constante. Todos los recursos tienen las mismas operaciones. Las operaciones nos permiten manipular el estado público del recurso. En un sistema REST típico se definen cuatro operaciones.
- CREATE. En esta operación el cliente manda al servidor una petición para crear un nuevo recurso. Opcionalmente el cliente puede mandar una representación del estado inicial de este recurso. El servidor responde con el identificador global del nuevo recurso.
- DELETE. En esta operación el cliente elimina un recurso del servidor. El cliente necesita saber el identificador del recurso.
- READ. Con esta operación el cliente puede leer una representación del estado de un recurso, identificado con su identificador global. El cliente puede especificar que tipos de representaciones entiende. Aquí lo que ocurre realmente es que se copia el estado del recurso en el servidor y se pega en el cliente. Ambas copias del estado no se mantiene sincronizadas. El servidor puede cambiar el estado real del recurso y el cliente, de forma independiente, puede modificar su copia local del estado del recurso.
- UPDATE. Como el servidor y el cliente tienen una copia diferente del estado, el cliente puede usar esta operación para sobrescribir o grabar su copia del estado en el servidor. De esta manera se puede actualizar el estado del recurso con las modificaciones hechas en el cliente.
- La implementación del servicio es libre de prohibir alguno de estos métodos para un recurso en concreto. También debe definir el modelo de datos que se va a publicar y que representaciones soporta. Lo que no puede hacer es inventarse operaciones de forma arbitraria. Las operaciones son siempre las mismas.
- Los distintos recursos se pueden interrelacionar y referenciar entre si mediante sus identificadores globales.
Una confusión típica es pensar que REST no es más que un CRUD llevado a la web, ¿no será mi BBDD relacional un sistema REST? No exactamente. Es parecido, pero existen algunas diferencias sutiles e importantes entre un CRUD simple o una BBDD con una arquitectura REST:
- Al contrario que en un CRUD típico, como una BBDD, el servidor puede soportar muchas representaciones de un mismo recurso: xml, pdf, png, gif, excel, html, json, texto, comaereas, churros binarios, etc.. Hay pocas BBDD que hagan esto.
- No penséis que las operaciones REST se limitan a hacer CRUD tradicional, no se trata solo de persistir nuestros cambios. Cuando hacemos un UPDATE, nuestra implementación del recurso además de grabar el estado en soporte persistente, debe hacer otras cosas, como validaciones de negocio o actualizaciones en otros recursos para mantener la consistencia global del sistema. Esto sí que se parece a una BBDD con triggers e integridad referencial, pero no es CRUD en el sentido de que no nos limitamos a grabar y ya está. Una DAO es CRUD, un recurso REST no (excepto en los casos más simples).
- Los recursos mantiene interrelaciones entre si. La topología de estas interrelaciones es compleja, puede ser un grafo arbitrario, con ciclos, o un simple árbol. Es más, los recursos de nuestro sistema se pueden interrelacionar con recursos en sistemas de terceras partes, ya que el identificador es único y global.
Algunos estareis pensando: «¿Existe en la actualidad alguna arquitectura REST? Estas cosas tan modernas tardan un tiempo en madurar, y yo no quiero usar una tecnología que esté verde». Pues resulta que REST es un enfoque maduro con un claro ejemplo existente en la actualidad: la world wide web, o web a secas. Veamos si la web tiene propiedades REST:
- La web está compuesta de recursos, cada página web puede considerarse un recurso.
- Cada recurso tiene un identificador único global, que es su URI (o URL para los antiguos o IRI para los más modernos). Usando una URL podemos llegar a cualquier recurso en la web.
- Dada una URI, y mediante el protocolo HTTP, podemos operar sobre estos recursos. La operación a realizar se especifica mediante el verbo HTTP. Mediante cabeceras especiales como Accept o Content-Type se puede especificar que representaciones entienden el servidor y el cliente y que representación se usa en un mensaje concreto para transporta el estado del recurso.
- El verbo GET hace la operación READ.
- El verbo DELETE hace la operación DELETE.
- El verbo PUT se usa normalmente para hacer UPDATE
- El verbo POST se usa normalmente para hacer CREATE.
- Las representaciones a usar se especifican mediante los llamados tipos mime. La mayoría de los tipos mime son estándares, como xml o json. El usar tipos mime estándar facilita la interoperabilidad.
La aplicación cliente típica de la web es el navegador. Los navegadores se dedican a hacer GETs sobre URIs para obtener representaciones de las distintas páginas web. En el caso habitual cada página sólo admite una representación, típicamente HTML o PDF o texto plano o imágenes. Pero eso no significa que una misma URI no pudiera soportar distintas representaciones.
Lo interesante de todo esto es que la web es un ejemplo perfecto de servicios distribuidos a nivel global totalmente interoperable (o casi). La web, y el protocolo HTTP es una arquitectura REST. La web son servicios REST que en general sólo soportan HTML. Casi cualquier página HTML es interoperable con casi cualquier navegador, y casi cualquier página HTML puede interoperar (referenciar) con otra página HTML construida por un tercero. Es sorprendente que con este claro ejemplo, presente en nuestro día a día, llegada la hora de pensar en como hacer servicios web, no se viera lo que tenemos delante de la cara, sino que se inventara algo como SOAP y WSDL. Mmmm, sospechoso.
Como veis podemos usar HTTP, URIs y tipos mime, para publicar servicios de datos, no meras páginas, que soporten multitud de representaciones y sean conformes a los principios REST. A este tipo de servicios de datos es a los que comúnmente se llaman servicios REST. Sin embargo aun tengo que contar por qué desde mi punto de vista los servicios REST son mejores que SOAP. Las razones son varias:
- HTTP es un protocolo que sigue los principios REST, por lo tanto hacer servicios REST es algo que aprovecha toda la infraestructura de la web ya existente: cache, proxies, firewall, compresión, etc. No se trata de inventar un protocolo y ver como meterlo con calzador para que encaje dentro de HTTP, sino usar el propio HTTP.
- La posibilidad de usar múltiples representaciones o formatos de datos, de forma natural, es una ventaja indiscutible. No hay que extender ningún protocolo, o limitarse a XML, el protocolo HTTP ya lo soporta de forma natural. Si usamos un poco de imaginación esto puede ser una característica muy potente.
- Los servicios REST tienen menor acoplamiento que los servicios basados en SOAP. Esto lo veremos en futuros posts.
- No necesitamos herramientas complejas, ni montones de código generado e inmantenible. Un simple framework nos basta. Para sistemas sencillos no necesitamos ni eso.
- Una aplicación AJAX o un móvil tienen la capacidad computacional suficiente para actuar como cliente de servicios REST.
- Es autodescubrible, no se necesita algo como un WSDL. Esto lo veremos también en futuros posts.
En el próximo post pienso aplicar de forma más concreta todos estos principios al mundo de las aplicaciones empresariales, y veremos como de sencillo es publicar y consumir un servicio REST. Así que ya sabéis, si queréis hacer servicios web usad los mismos principios que hicieron la web posible, usad REST.
[…] This post was mentioned on Twitter by Enrique Amodeo Rubio, Alina and Yeray Darias, Israel Alcázar. Israel Alcázar said: RT @eamodeorubio: Te lo dije…Servicios web (2): ¿Qué es REST? http://wp.me/pQAdW-4K #rest […]
Genial post, me ha gustado mucho, aunque me ha parecido que no queda claro, que, un servicio rest puede ser tan inteligente para que dependiendo de lo que le pida el cliente represente la entidad de forma diferente.
Tipico:
Navegador, html
JavaScript: , Json…
😀
Gracias. Intentaré aclarar este punto del multiformato en siguientes posts.
¡Por fin una descripción de servicios web y REST sin complejos!
Echandole un poco de imaginación al REST, se me ocurren otros protocolos «web» que podrían ayudar respecto a arquitecturas SOA, por ejemplo WebDAV, FTP, etc.
WebDAV podría servir para gestión de versiones, gestión documental, etc.
Pensando en arquitecturas RIA, es interesante que ya hay muchas implementaciones JavaScript de WebDAV…
Sí, WebDAV es otro protocolo REST. Extiende el protocolo HTTP con nuevos verbos y en teoría sirve para la edición y versionado distribuida de recursos web. Desgraciadamente no tengo mucha experiencia con él y no sabría decir su grado de implantación en la realidad y como de interoperables son las implementaciones.
FTP por otro lado, sí es un protocolo web pero no totalmente REST. Fíjate que es curioso que el FTP está cayendo en desuso y lo que se hace ahora es upload/download de ficheros a través de HTTP o simplemente tunneling de FTP sobre HTTP. Es menos eficiente que FTP puro, pero se ve que más sencillo de usar y configurar con lo que FTP en si pierde terreno. Se ve que en la web el que algo sea simple y efectivo es una ventaja muy importante, je, je, KISS y la web se llevan bien.
WebDAV está implementado en la mayoría de gestores documentales del mercado. Alfresco y el gestor de documentos de Liferay, basado internamente en Jackrabbit, sirven los contenidos en protocolo WebDAV. Podemos afirmar por lo tanto que WebDAV es otro protocolo REST enormemente extendido, aunque quizá no tan utilizado.
Saludos!
Hola Ángel, no sabía este dato. Gracias por la info.
Muchas gracias por toda la información ahora me queda un poco más claro todo.. 😀
Tienes planeado realizar algún tutorial para montar un servidor REST con apache?
Saludos y gracias…
Gracias. La verdad es que pensaba seguir con varios posts sobre REST, centrándome en como hacer definir la interfaz REST sobre un ejemplo funcional concreto. En principio pienso hacer los posts «tecnológicamente neutrales» para que la gente use la tecnología que quiera (.NET, Rails, PHP, LAMP, JEE, Spring…), pero tal vez concluya la serie de posts con un ejemplo basado en tecnología JAX-RS.
Bueno Enrique, aquí estoy para ponerme al día!
En este post, una gran definición-introducción al mundo REST, que se debería leer cualquiera que quiera luego usar cualquiera de las implementaciones actuales.
A por el siguiente …! 😉
MUY BUENO EL POST DE ANTEMANO LO FELICITO PERO ME GUSTARIA SABER SI YA SALIO EL PROXIMO POST DONDE EXPONDRAS «COMO PUBLICAY Y CONSIMIR UN SERVICIO WEB REST».
GRACIAS.
Sí, hay más posts dedicados a como diseñar una buena interfaz para servicios REST. Sin embargo todavía no he dedicado ninguno a montar un ejemplo práctico con código y demás. En un futuro haré uno.
HOLA ENRIQUE MUY BUENO TUS POST, PERO ME GUSTARIA QUE EXPLICARAS LO QUE OCURRE DESDE QUE UN CLIENTE HACE UNA PETICION A UN SERVIDOR, OSEA TODO EL RECORRIDO Y UN EJEMPLO DONDE USES TODOS LOS METODOS DE HTTP(GET,POST,PUT,DELETE).
GRACIAS ESPERO TU RESPUESTA.
Muy buena información, y lo más importante muy bien explicada, con terminologia clara. Muy recomendable te da una visión global de la arquitectura para aplicarla en futuros proyectos.
Me ha encantado la frase: sino que se inventara algo como SOAP y WSDL. Mmmm, sospechoso.
Y no sólo en los gestores documentales. WebDAV está en la mayoría de los servidores web. Desde Apache a LightHTTPD. el mod_dav de Apache es de los más usados.
Es muy sencillo de implementar.
[…] realidad lo que ahora vamos a utilizar la arquitectura llamada REST (les dejo este interesante artículo donde explican un poco mas de esta arquitectura). Bueno, […]
[…] se si el de algunos de vosotros. En realidad lo que ahora vamos a utilizar la arquitectura llamada REST (les dejo este interesante artículo donde explican un poco mas de esta arquitectura). Bueno, ahora […]
[…] [Fuente: https://eamodeorubio.wordpress.com/2010/07/26/servicios-web-2-%C2%BFque-es-rest/%5D […]
Muy buen post! gracias me ha quedado mucho más claro!
[…] <servicios REST> pueden ser utilizados con peticiones <HTTP> “estándar” y en cualquier caso, […]
[…] quieres ampliar información, puedes consultar por ejemplo la Wikipedia o este interesante artículo de introducción a REST en un estilo más informal pero muy […]
[…] Servicios web (2): ¿Qué es REST? […]
[…] Servicios web (2): ¿Qué es REST? […]