Download Tema03-restful - Web de Lenin Lemus
Document related concepts
no text concepts found
Transcript
Restful JAX-RS Java API for RESTful Web Services es una API del lenguaje de programación Java que proporciona soporte en la creación de servicios web de acuerdo con el estilo arquitectónico Representational State Transfer (REST). JAX-RS usa anotaciones, introducidas en Java SE 5, para simplificar el desarrollo y despliegue de los clientes y puntos finales de los servicios web. A partir de la versión 1.1 en adelante, JAX-RS es una parte oficial de Java EE 6. Una característica notable de ser parte oficial de Java EE es que no se requiere configuración para comenzar a usar JAX-RS. Para los entornos que no son Java EE 6 se requiere configurar el descriptor de despliegue web.xml. Especificación JAX-RS proporciona algunas anotaciones para ayudar a mapear una clase recurso (un POJO) como un recurso web. Entre estas anotaciones se incluyen: @Path especifica la ruta de acceso relativa para una clase recurso o método. @GET, @PUT, @POST, @DELETE y @HEAD especifican el tipo de petición HTTP de un recurso. @Produces especifica los tipos de medios MIME de respuesta. @Consumes especifica los tipos de medios de petición aceptados. Anotaciones adicionales @PathParam enlaza el parámetro a un segmento de ruta. @QueryParam enlaza el parámetro al valor de un parámetro de consulta HTTP. @MatrixParam enlaza el parámetro al valor de un parámetro de matriz de HTTP. @HeaderParam enlaza el parámetro a un valor de cabecera HTTP. @CookieParam enlaza el parámetro a un valor de cookie. @FormParam enlaza el parámetro a un valor de formulario. @DefaultValue especifica un valor por defecto para los enlaces anteriores cuando la clave no es encontrada. @Context devuelve todo el contexto del objeto. (Por ejemplo: @Context HttpServletRequest request) JAX-RS 2.0 En enero de 2011, se formó un grupo de expertos para trabajar en JAXRS 2.0. Los objetivos principales fueron una API de cliente común y el apoyo a Hipermedia siguiendo el principio HATEOAS de REST. En mayo de 2013 se publicó la versión final Implementaciones Apache CXF, un framework de servicios web de código abierto. Jersey, la implementación de referencia de Sun (ahora Oracle). RESTeasy, implementación de JBoss. Restlet, creado por Jerome Louvel, un pionero en frameworks de REST. Apache Wink, proyecto de Apache Software Foundation Incubator, el módulo del servidor implementa JAX-RS. JBoss, la librería org.jboss.resteasy da soporte de JAX-RS sobre la plataforma JBoss. JERSEY De acuerdo con el Tutorial de Java EE 6, Volumen 1: Jersey es la implementación de referencia de calidad de producción de Sun para JSR 311: JAX-RS: The Java API for RESTful Web Services. Jersey implementa soporte para las anotaciones definidas en la JSR-311, lo que facilita a los desarrolladores crear servicios web RESTful con Java y la JVM de Java. Jersey también añade características adicionales no especificadas por la JSR.3 Transferencia de Estado Representacional (REST) Es un estilo de arquitectura software para sistemas hipermedia distribuidos como la World Wide Web. El término se originó en el año 2000, en una tesis doctoral sobre la web escrita por Roy Fielding, uno de los principales autores de la especificación del protocolo HTTP y ha pasado a ser ampliamente utilizado por la comunidad de desarrollo. Conceptos detrás de REST originalmente REST se refería a un conjunto de principios de arquitectura, en la actualidad se usa en el sentido más amplio para describir cualquier interfaz entre sistemas que utilice directamente HTTP para obtener datos o indicar la ejecución de operaciones sobre los datos, en cualquier formato (XML, JSON, etc) sin las abstracciones adicionales de los protocolos basados en patrones de intercambio de mensajes, como por ejemplo SOAP. Es posible diseñar sistemas de servicios web de acuerdo con el estilo arquitectural REST de Fielding y también es posible diseñar interfaces XMLHTTP de acuerdo con el estilo de llamada a procedimiento remoto (RPC), pero sin usar SOAP. Estos dos usos diferentes del término REST causan cierta confusión en las discusiones técnicas, aunque RPC no es un ejemplo de REST. Los sistemas que siguen los principios REST se llaman con frecuencia RESTful: Escalabilidad REST afirma que la web ha disfrutado de escalabilidad como resultado de una serie de diseños fundamentales clave: Un protocolo cliente/servidor sin estado: cada mensaje HTTP contiene toda la información necesaria para comprender la petición. Como resultado, ni el cliente ni el servidor necesitan recordar ningún estado de las comunicaciones entre mensajes. Sin embargo, en la práctica, muchas aplicaciones basadas en HTTP utilizan cookies y otros mecanismos para mantener el estado de la sesión ◦ algunas de estas prácticas, como la reescritura de URLs, no son permitidas por REST Un conjunto de operaciones bien definidas que se aplican a todos los recursos de información: HTTP en sí define un conjunto pequeño de operaciones, las más importantes son POST, GET, PUT y DELETE. Con frecuencia estas operaciones se equiparan a las operaciones CRUD en bases de datos que se requieren para la persistencia de datos, aunque POST no encaja exactamente en este esquema. Una sintaxis universal para identificar los recursos. En un sistema REST, cada recurso es direccionable únicamente a través de su URI. El uso de hipermedios, tanto para la información de la aplicación como para las transiciones de estado de la aplicación: la representación de este estado en un sistema REST son típicamente HTML o XML. Como resultado: es posible navegar de un recurso REST a muchos otros, simplemente siguiendo enlaces sin requerir el uso de registros u otra infraestructura adicional. Recursos Un concepto importante en REST es la existencia de recursos (elementos de información), que pueden ser accedidos utilizando un identificador global (un Identificador Uniforme de Recurso). Para manipular estos recursos, los componentes de la red (clientes y servidores) se comunican a través de una interfaz estándar (HTTP) e intercambian representaciones de estos recursos (los ficheros que se descargan y se envían) - es cuestión de debate, no obstante, si la distinción entre recursos y sus representaciones es demasiado platónica para su uso práctico en la red, aunque es popular en la comunidad RDF. La petición puede ser transmitida por cualquier número de conectores (por ejemplo clientes, servidores, cachés, túneles, etc.) pero cada uno lo hace sin "ver más allá" de su propia petición (lo que se conoce como stateless (sin estado), otra restricción de REST, que es un principio común con muchas otras partes de la arquitectura de redes y de la información). ◦ Una aplicación puede interactuar con un recurso conociendo el identificador del recurso y la acción requerida, no necesitando conocer si existen cachés, proxys, cortafuegos, túneles o cualquier otra cosa entre ella y el servidor que guarda la información. La aplicación, sin embargo, debe comprender el formato de la información devuelta (la representación), que es por lo general un documento HTML o XML, aunque también puede ser una imagen o cualquier otro contenido. REST frente a RPC Una aplicación web REST requiere un enfoque de diseño diferente a una aplicación basada en RPC REST frente a RPC En RPC, se pone el énfasis en la diversidad de operaciones del protocolo, o verbos; por ejemplo una aplicación RPC podría definir operaciones como: En REST, el énfasis se pone en los recursos, o sustantivos; especialmente en los nombres que se le asigna a cada tipo de recurso. Por ejemplo, una aplicación REST podría definir algunos tipos de recursos asignándoles estos nombres: • • • • • • • • • • • • •Usuario {} •Localización {} getUser() addUser() removeUser() updateUser() getLocation() addLocation() removeLocation() updateLocation() listUsers() listLocations() findLocation() findUser() Cada recurso tendría su propio identificador, como http://www.example.org/locations/us/ny/new_york_city . Los clientes trabajarían con estos recursos a través de las operaciones estándar de HTTP, como GET para descargar una copia del recurso. • • Cada objeto tiene su propia URL y puede ser fácilmente cacheado, copiado y guardado como marcador. POST se utiliza por lo general para acciones con efectos laterales, como enviar una orden de compra o añadir ciertos datos a una colección. Implementaciones La blogosfera en su mayor parte, basado en REST, dado que implica descargar ficheros XML (en formato RSS o Atom) que contienen listas de enlaces a otros recursos. Amazon.com ofrece su interfaz para desarrolladores tanto en formato REST como en formato SOAP (siendo la versión REST la que recibe mayor tráfico). eBay ofreció hasta 2008 una interfaz REST para desarrolladores. El Proyecto "Seniors Canada On-line" del Gobierno de Canadá ofrece una interfaz REST descrito aquí. Bloglines ofrece una API basada en REST para desarrolladores. Yahoo! ofrece una API en REST para desarrolladores. El mecanismo de enrutamiento de Ruby on Rails soporta aplicaciones REST utilizando el patrón de diseño MVC. Microsoft tiene su implementación en ADO.NET Data Services Framework (anteriormente conocido como “Astoria”) . El mismo mecanismo en Catalyst también soporta aplicaciones REST mediante MVC. El publicador de objetos de Zope. Facebook ofrece una API basada en REST. Twitter ofrece una API basada en REST. MEGA ofrece una API basada en REST. MercadoLibre ofrece una API basada en REST para desarrolladores. HATEOAS Abreviación de Hypermedia As The Engine Of Application State Es una restricción de la arquitectura de aplicación REST que la distingue de otras arquitecturas de aplicación. El principio básico es que un cliente interactúa con una aplicación a través de hipermedios proporcionados por servidores de aplicaciones ◦ Un cliente REST no necesita conocer a priori como interactuar la aplicación hipermedia ◦ En contraste, en algunas arquitecturas orientadas a servicios (SOA), los clientes y los servidores interactúan a través de una interfaz fija definida a través e documentos IDL La restricción HATEOAS desaclopa a un cliente y a un servidor de forma que permite que la funcionalidad del servidor evolucione independientemente Detalles A REST client enters a REST application through a simple fixed URL. ◦ All future actions the client may take are discovered within resource representations returned from the server. ◦ The media types used for these representations, and the link relations they may contain, are standardized. ◦ The client transitions through application states by selecting from the links within a representation or by manipulating the representation in other ways afforded by its media type. ◦ In this way, RESTful interaction is driven by hypermedia, rather than out-ofband information. For example, [2] here is a GET request to fetch an Account resource, requesting details in an XML representation: GET /account/12345 HTTP/1.1 Host: somebank.org Accept: application/xml HTTP/1.1 200 OK Content-Type: application/xml Content-Length: ... <?xml version="1.0"?> <account> <account_number>12345</account_number> <balance currency="usd">100.00</balance> <link rel="deposit" href="https://somebank.org/account/12345/deposit" /> <link rel="withdraw" href="https://somebank.org/account/12345/withdraw" /> <link rel="transfer" href="https://somebank.org/account/12345/transfer" /> <link rel="close" href="https://somebank.org/account/12345/close" /> </account> Note the response contains 4 possible follow-up links - to make a deposit, a withdrawal, a transfer or to close the account. Some time later the account information is retrieved again, but now the account is overdrawn: HTTP/1.1 200 OK Content-Type: application/xml ContentLength: ... <?xml version="1.0"?> <account> <account_number>12345</account_number> <balance currency="usd">-25.00</balance> <link rel="deposit" href="https://somebank.org/account/12345/deposit" /> </account> Now only one link is available: to deposit more money. In its current state, the other links are not available. ◦ Hence the term Engine of Application State. ◦ What actions are possible vary as the state of the resource varies. A client does not need to understand every media type and communication mechanism offered by the server. The ability to understand new media types can be acquired at run-time through "code-on-demand" provided to the client by the serve Orígenes The HATEOAS constraint is an essential part of the "uniform interface" feature of REST, as defined in Roy Fielding's doctoral dissertation. Fielding has further described the concept on his blog. The purpose of some of the strictness of this and other REST constraints, Fielding explains, is "software design on the scale of decades: every detail is intended to promote software longevity and independent evolution. Many of the constraints are directly opposed to short-term efficiency. Unfortunately, people are fairly good at shortterm design, and usually awful at long-term design". Implementaciones Spring HATEOAS parte del Spring Framework Yii 2 Framework REST API soporta HATEOAS, Jersey API soporta HATEOAS Tastypie soporta HATEOAS Apigility, API builder based on Zend Framework 2, soporta HATEOAS Hateoas PHP library, soporta HATEOAS REST Web Services implementations.