Tema 3.2: Servicios Web REST: Conceptos Básicos Índice Introducción Introducción a HTTP Conceptos básicos de REST El estilo arquitectónico REST REST en la práctica Características de un Servicio Web REST Valoración y Conclusiones Ejemplos de servicios web REST: RSS / ATOM Introducción (1) REpresentational State Transfer. Estilo arquitectónico propuesto por Roy Fielding en 2000. La Web es, sin duda, la aplicación distribuida más exitosa de la historia. REST: Estilo arquitectónico para construir aplicaciones distribuidas inspirado en las características de la web. Estudiaremos el estilo arquitectónico REST en el apartado 3.6. REST se basa fuertemente en HTTP 1.1. Introducción (y 2) Frecuentemente REST se utiliza como sinónimo de servicios web que, en lugar de las tecnologías SOAP, utilizan directamente HTTP y XML. No añaden nuevos protocolos ni lenguajes: utilizan solamente HTTP 1.1 y formatos como XML para especificar mensajes. A veces en la práctica, sobre todo con lenguajes de scripting, esto es más sencillo que usar compiladores de stubs y skeletons como en SOAP. Interoperabilidad garantizada. Pueden utilizarse para implementar RPCs, no sólo el nuevo estilo arquitectónico Ejemplo: Información de películas en el tema 2. Introducción a HTTP HTTP: HyperText Transfer Protocol. Estandarizado por el W3C y la IETF. La versión actual es HTTP 1.1. Protocolo cliente/servidor utilizado en la Web. Inicialmente construido para transferir páginas HTML. Esquema petición/respuesta. Utiliza TCP para comunicar cliente y servidor (puerto reservado: 80). Desde HTTP 1.1, una conexión HTTP puede utilizarse para varias peticiones. Concepto clave: URL como identificador de recurso. Peticiones HTTP (1) Una petición HTTP consta de: Una URL y un método de acceso (GET, POST, PUT,…). Cabeceras. Metainformación de la petición. Cuerpo del mensaje (opcional). Métodos de acceso: GET: Solicita una representación del recurso especificado. No debe causar “efectos secundarios” (modificaciones en el recurso). POST: Envía datos para que sean procesados (e.g. formularios) al recurso indicado. Puede crear un nuevo recurso, modificar un recurso existente o ambas cosas. PUT: Carga en el servidor una representación de un recurso. DELETE: Elimina el recurso especificado. Peticiones HTTP (2) Peticiones GET, PUT, DELETE deben ser idempotentes. Múltiples peticiones iguales deben tener el mismo efecto que una sola. Las peticiones GET: No tienen cuerpo del mensaje. Pueden especificarse parámetros en la URL (consultas). Se especifican como pares campo=valor, separados por el carácter ‘&’. http://www.bookshop.com/search?tit=Java&author=John+Smith No deben tener efectos secundarios. Las peticiones POST: Normalmente los datos van en el cuerpo del mensaje. Pueden causar efectos secundarios: Crear un nuevo recurso Modificar un recurso existente Respuestas HTTP Una respuesta HTTP contiene: Código de Status: 200: 404: 500: 403: … OK. Recurso no encontrado. Error en el servidor. Error de autorización. Cabeceras. Metainformación de la respuesta. Cuerpo del mensaje: Representación del recurso invocado. … o mensaje de error. Cabeceras HTTP Especifican metainformación sobre las peticiones / respuestas. Entre otras: Tipo de datos esperados / devueltos como respuesta. Codificación esperada / devuelta. Lenguaje esperado / devuelto. Antigüedad de la respuesta. Control de cache (e.g. tiempo de expiración, última modificación,…) Credenciales de autorización. Información para proxies. Información para Autenticación. Agente del usuario (e.g. navegador utilizado). … Características Servicios REST(1) Cliente- Servidor. Sin estado. Clientes invocan directamente URLs para acceder a puntos de acceso Cada petición de un cliente debe contener toda la información necesaria. No puede beneficiarse de contexto almacenado en servidor. Intermediarios El que las peticiones sean directamente HTTP permite saber algo sobre su semántica: Petición GET no invalida documentos en cache. Petición POST, PUT, DELETE invalidan. En SOAP no se sabe la semántica de forma genérica. Caches son un componente importante de escalabilidad. Características Servicios Web (2) Intermediarios: Servicio-1 Cache HTTP Cliente HTTP HTTP Servicio-2 HTTP ... Servicio-N Tema 3.2.1: RSS / ATOM Introducción (1) RSS / ATOM: Familias de formatos XML utilizados habitualmente para sindicación de contenidos (“web feeds”): Blogs, Noticias,… “Web feed”: Usuario se subscribe a los “feeds” que le interesan (e.g. un blog, un periódico on-line,…). Puede utilizar un programa lector de “feeds” para ver todos los nuevos contenidos, sin necesidad de ir a cada sitio web. Para cada nuevo contenido, normalmente se muestra cierta información básica (título, resumen,…) y un enlace a la información completa en la fuente original. Los principales navegadores incluyen ya un lector de feeds. Introducción (2) El nombre RSS puede referirse a varios estándares, no siempre compatibles entre sí: Inicialmente creado por Netscape, fue abandonado y extendido de forma independiente por dos grupos. Como consecuencia hay dos ramas de compatibilidad en RSS: Really Simple Syndication (RSS 2.0). Rich Site Summary (RSS 0.91, RSS 1.0). RDF Site Summary (RSS 0.9, RSS 1.0). RSS 0.9, RSS 1.0, RSS 1.1. RSS 0.91, RSS 0.92, RSS 2.0 Los más utilizados son RSS 1.0 y RSS 2.0. La rama “2.0” es más simple, ya que no usa RDF. La mayoría de lectores soportan ambas ramas. Introducción (3) ATOM surge debido a los problemas de compatibilidad entre versiones y a algunas limitaciones adicionales de RSS. ATOM Syndication: Estándar de la IETF (Internet Engineering Task Force) publicado en RFC 4287. Los principales lectores de “feeds” también soportan Atom. Muchos productores de feeds soportan ambos formatos (RSS, Atom), aunque otros sólo uno de ellos. Sobre todo en artículos no técnicos, es habitual encontrar el término “RSS” referido a cualquier formato de sindicación: tanto a RSS como a Atom. Introducción (y 4) Los servicios que proporcionan feeds ATOM / RSS son servicios web REST (RESTful, de hecho): Los contenidos se acceden a través de HTTP y se devuelven en XML. Las “entidades” (canales e items) se pueden representar mediante URIs únicos (idea más fuerte en ATOM). Es un ejemplo de integración a través de la implantación de un vocabulario estándar en lugar de un API estándar. Su éxito ha sido espectacular. Es importante resaltar que es un formato dedicado exclusivamente a representar contenidos y no cualquier tipo de información estructurada. Se usa un “esquema” fijo. Información en RSS 2.0 (1) <?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0"> <channel> <title> Información de películas en la UDC</title> <link>http://ws.udc.es/movies</link> <description> Este sitio ofrece información completa sobre películas estrenadas recientemente.</description> <language>es-ES</language> <pubDate>Mon, 19 Mar 2007 04:00:00 GMT</pubDate> <lastBuildDate>Mon, 19 Mar 2007 13:54:26 GMT</lastBuildDate> <managingEditor>[email protected]</managingEditor> <webMaster>[email protected]</webMaster> <ttl>60</ttl> Información en RSS 2.0 (2) <item> <title> La maldición del escorpión de Jade </title> <link>http://ws.udc.es/movies/maldicion_escorpion_jade.html </link> <description>Comedia. 103 minutos. Estrenada el 19/10/2001 Dirigida por Woody Allen. Con Woody Allen, Helen Hunt, Dan Aykroyd, Elzabeth Berkley, Charlize Theron. Woody Allen encarna a CW Briggs, el rey de los investigadores de seguros de Nueva York en 1940 --o cuanto menos eso es lo que no cesa de decirle a la nueva experta en eficiencia de la empresa, Betty Ann Fitzgerald (Helen Hunt)--. Briggs hace alarde de ser capaz de arruinar cualquier treta de seguros penetrando en la mente del malhechor, pero ahora, debido a los poderes hipnóticos del "Escorpión de Jade", es la mente de un malhechor la que penetra en Briggs </description> <category>Comedy</category> <pubDate>Mon, 19 Mar 2007 04:00:00 GMT</pubDate> <guid>http://ws.udc.es/movies/maldicion_escorpion_jade.html </guid> </item> Información en RSS 2.0 (y 3) <item> <title>Amelie</title> <link> http://ws.udc.es/movies/amelie.html </link> <description> Comedia romántica. 120 min. Estrenada el 19/10/2001. Dirigida por Jean-Pierre Jeunet. Con Audrey Tautou, Mathieu Kassovitz, Rufus, Yolande Moreau, Artus de Penguern, Dominique Pinon. Amelie no es una chica como las demás. Ha visto a su pez de colores deslizarse hacia las alcantarillas ... </description> <category>Comedy</category> <category>Romantic</category> <guid>http://ws.udc.es/movies/amelie.html</guid> <pubDate>Mon, 19 Mar 2007 13:54:26 </pubDate> </item> </channel> </rss> Formato RSS 2.0 (1) Es un documento XML. Declaración RSS: <rss version=“2.0”> Un único elemento channel con información acerca del canal y sus contenidos. Un canal puede contener cualquier número de elementos item. Cada item representa un elemento de información del canal (noticia, entrada en el blog,…). Subelementos obligatorios del canal: title. El nombre del canal. link. La URL al sitio web HTML que se corresponde con el canal. description. Descripción corta del canal. Formato RSS 2.0 (2) Subelementos opcionales del canal: language. Lenguaje del canal. Valores definidos por el W3C (http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes) pubDate. La fecha de publicación del grueso del contenido del canal. Por ejemplo, si un site renueva el grueso de su contenido diariamente, este valor variará una vez al día. Formato de fecha: RFC 822 lastBuildDate. La última vez que cambió el contenido del canal. managingEditor. E-mail del responsable de los contenidos. webMaster. E-mail del responsable técnico del sitio web. ttl. Indica cuantos minutos un canal puede ser cacheado. Formato RSS 2.0 (3) Subelementos opcionales del canal (cont): copyright. Información de copyright de los contenidos. generator. Programa utilizado para generar el canal. cloud. Mecanismo simple publish-subscribe. image. Especifica una imagen o logo del canal. rating. Rating PICS (http://www.w3.org/PICS/). skipHours, skipDays. Información para agregadores sobre qué horas y días no se actualiza contenido. Otros: docs, textInput. Formato RSS 2.0 (y 4) Subelementos de item: Todos son opcionales pero debe aparecer al menos uno de los dos siguientes: title o description. title. Título del item. link. La URL al contenido HTML completo del item. category. Incluye el item en una o más categorías de una taxonomía. pubDate. Indica cuando se publicó el item. guid. Identificador único del item (permalink). Puede coincidir o no con el link. author. E-mail del autor del item. comments. URL de página con comentarios sobre el item. enclosure. Objeto multimedia asociado al item. source. Feed de origen del item. Información en ATOM (1) <?xml version="1.0" encoding="ISO-8859-1"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Información de películas en la UDC</title> <subtitle> Este sitio ofrece información completa sobre películas estrenadas recientemente </subtitle> <link href="http://ws.udc.es/movies"/> <updated>2006-03-19T13:54:26Z</updated> <author> <name>Fernando Bellas</name> </author> <author> <name>Alberto Pan</name> </author> Información en ATOM (2) <entry> <title>La maldición del escorpión de Jade </title> <link href="http://ws.udc.es/movies/maldicion_escorpion_jade.html"/> <id> http://ws.udc.es/movies/maldicion_escorpion_jade.html </id> <updated>2006-03-19T04:00:00Z</updated> <summary>Woody Allen encarna a CW Briggs, el rey de los investigadores de seguros de Nueva York en 1940 --o cuanto menos eso es lo que no cesa de decirle a la nueva experta en eficiencia de la empresa, Betty Ann Fitzgerald (Helen Hunt)--. Briggs hace alarde de ser capaz de arruinar cualquier treta de seguros penetrando en la mente del malhechor, pero ahora, debido a los poderes hipnoticos del "Escorpion de Jade", es la mente de un malhechor la que penetra en Briggs </summary> <content>Comedia. 103 minutos. Estrenada el 19/10/2001 Dirigida por Woody Allen. Con Woody Allen, Helen Hunt, Dan Aykroyd, Elzabeth Berkley, Charlize Theron. Woody Allen encarna a CW Briggs, el rey de los investigadores de seguros de Nueva York en 1940 --o cuanto menos eso es lo que no cesa de decirle a la nueva experta en eficiencia de la empresa, Betty Ann Fitzgerald (Helen Hunt)--. Briggs hace alarde de ser capaz de arruinar cualquier treta de seguros penetrando en la mente del malhechor, pero ahora, debido a los poderes hipnoticos del "Escorpion de Jade", es la mente de un malhechor la que penetra en Briggs </content> <category> Comedia </category> </entry> Información en ATOM (y 3) <entry> <title>Amelie</title> <link href="http://ws.udc.es/movies/amelie.html"/> <id> http://ws.udc.es/movies/amelie.html </id> <updated>2006-03-19T13:54:26Z</updated> <summary>Amelie no es una chica como las demás. Ha visto a su pez de colores deslizarse hacia las alcantarillas ... </summary> <content>Comedia romántica. 120 min. Estrenada el 19/10/2001. Dirigida por Jean-Pierre Jeunet. Con Audrey Tautou, Mathieu Kassovitz, Rufus, Yolande Moreau, Artus de Penguern, Dominique Pinon. Amelie no es una chica como las demás. Ha visto a su pez de colores deslizarse hacia las alcantarillas ... </content> <category> Comedia </category> <category> Romántica </category> </entry> </feed> Formato Documentos Atom (1) Más complejo que RSS. No haremos una descripción exhaustiva. Es un documento XML. Utiliza el espacio de nombres http://www.w3.org/2005/Atom El elemento feed es similar al channel RSS. El elemento entry es similar al item RSS. Subelementos obligatorios de feed: title. Nombre del canal. author. Autor (pueden ser varios). Puede especificar el nombre y el e-mail. Si todos los entry tienen su propio author, no es necesario. updated. Fecha última modificación (formato RFC 3339). Formato Documentos Atom (2) Otros subelementos: subtitle. Breve descripción. rights, category, generator, icon, logo, id, contributor... Subelementos de entry: id. Identificador único de la entrada. Debe seguir el formato IRI (Internationalized Resource Identifier: RFC 3987) Las IRIs “internacionalizan” las URIs permitiendo más caracteres.. Toda URI es una IRI. title. Título de la entrada. updated. Fecha de última modificación de la entrada. author. Autor de la entrada. Puede especificar nombre y email. Si se especifica en el feed no es necesario. summary. Resumen textual del contenido de la entrada. Formato Documentos Atom (y 3) Subelementos opcionales de entry: content. Contenido completo de la entrada. No tiene porque ser textual, sino que puede especificar explícitamente su tipo (puede ser HTML, XHTML o binario). Puede especificarse el lenguaje. category. Categorías a las que se asocia la entrada. source, published,… ATOM vs RSS RSS no especifica explícitamente el tipo de contenido mientras que ATOM sí. RSS normalmente lleva texto o HTML, pero es necesario aplicar heurísticas para detectarlo. En ATOM puede ser también XHTML o binario. ATOM separa el resumen del contenido completo. ATOM utiliza mecanismos estándar XML para manejar distintos lenguajes. ATOM utiliza un formato de fechas diferente. ATOM utiliza IRIs. En ATOM es obligatorio que cada entrada tenga un identificador único. ATOM soporta firma digital utilizando el estándar W3C llamado XML Digital Signature. ATOM tiene un esquema XML. Generación y Parsing RSS /ATOM Tanto RSS como ATOM pueden ser generados fácilmente desde cualquier aplicación web. Cualquier parser XML puede ser utilizado para deserializar estos formatos en objetos. Existen algunos parsers específicos para los principales lenguajes. En JAVA: E.g. JDOM. ROME (http://wiki.java.net/bin/view/Javawsxml/Rome). EDDIE (http://www.davidpashley.com/projects/eddie.html). Soportan la generación y parsing de los principales formatos e incluso la traducción desde un formato a otro. XSLT (1) XSLT (eXtensible Stylesheet Language Transformations) es un lenguaje para convertir un documento XML en otro sin modificar el original. Estándar W3C (http://www.w3.org/TR/xslt) Puede ser utilizado para generar HTML partiendo de XML. La idea básica es asociar un markup a cada elemento del XML. Según se va parseando el XML, se va generando el HTML asociado. Ejemplo: Una aplicación podría recuperar directamente los datos de las películas en XML o RSS y aplicar directamente una transformación XSLT para generar un documento HTML que mostrar al usuario. XSLT: Ejemplo (de Wikipedia) 1) XML original 2) Transformación XSLT <?xml version="1.0" ?> <persons> <person username="JS1"> <name>John</name> <fam_name>Smith</fam_name> </person> <person username="MI1"> <name>Nancy</name> <fam_name>Davolio</fam_name> </person> </persons> <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform " version="1.0"> <xsl:template match="/persons"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>xsl wiki ex.</title> </head> <body> <h1>Persons</h1> <ul> <xsl:apply-templates select="person"> <xsl:sort select="fam_name" /> </xsl:apply-templates> </ul> </body> </html> </xsl:template> 3) XHTML obtenido <?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>xsl wiki ex.</title> </head> <body> <h1>Persons</h1> <ul> <li>Davolio, Nancy</li> <li>Smith, John</li> </ul> </body> </html> <xsl:template match="person"> <li> <xsl:value-of select="fam_name"/>, <xsl:value-of select="name"/> </li> </xsl:template> </xsl:stylesheet>