x
1

Transferencia de Estado Representacional



La transferencia de estado representacional (en inglés representational state transfer) o 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.

Si bien el término REST se refería originalmente a un conjunto de principios de arquitectura —descritos más abajo—, 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.

REST afirma que la web ha disfrutado de escalabilidad como resultado de una serie de diseños fundamentales clave:

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). Así, 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.

Una aplicación web REST requiere un enfoque de diseño diferente a una aplicación basada en RPC (llamada de procedimiento remoto). 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, al contrario, 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:

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. Obsérvese cómo 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.

Por ejemplo, el registro para un usuario podría tener el siguiente aspecto:

Para actualizar la localización del usuario, un cliente REST podría primero descargar el registro XML anterior usando GET. El cliente después modificaría el fichero para cambiar la localización y lo subiría al servidor utilizando HTTP PUT.

Nótese, sin embargo, que los verbos HTTP (POST, GET, PUT, DELETE) no proporcionan ningún mecanismo estándar para descubrir recursos -- no hay ninguna operación LIST o FIND en HTTP, que se corresponderían con las operaciones list*() y find*() en el ejemplo RPC. En su lugar, las aplicaciones basadas en datos REST resuelven el problema tratando una colección de resultados de búsqueda como otro tipo de recurso, lo que requiere que los diseñadores de la aplicación conozcan URLs adicionales para mostrar o buscar cada tipo de recurso.

Por ejemplo, una petición GET HTTP sobre la URL http://www.example.org/locations/us/ny/ podría devolver un enlace a una lista de ficheros en XML con todas las localizaciones posibles en Nueva York, mientras que una petición GET a la URL http://www.example.org/users?surname=Michaels podría devolver una lista de enlaces a todos los usuarios con el apellido "Michaels".

REST proporciona algunas indicaciones sobre cómo realizar este tipo de acciones como parte de su restricción "hipermedia como el medio de estado de la aplicación", lo que sugiere el uso de un lenguaje de formularios (tales como un formulario HTML) para especificar consultas parametrizadas.

La iniciativa OpenSearch de A9.com intenta estandarizar las búsquedas usando REST estableciendo especificaciones para descubrir recursos y un formato genérico para utilizar con sistemas basados en REST, incluyendo el RDF, XTM, Atom, RSS (en sus varias formas) y XML con XLink para gestionar los enlaces.

En su disertación original[1]​ del año 2000, Roy T. Fielding define REST como un "...estilo arquitectónico para sistemas distribuidos de hipermedia, describiendo los principios de ingeniería de software que guían REST y las constantes de interacción elegidas para retener esos principios...". Estos principios son:

Por la extensión de estas directrices y las particularidades de cada proyecto, dominio de negocio y API, puede resultar complejo aunar en una misma especificación todos los principios que REST describe. Por ello, el modelo de madurez de Richardson describe los niveles por los que pasa una especificación de API REST desde que es creada hasta que se perfecciona adquiriendo controles hipermedia. Estos niveles son:

Mientras que una arquitectura REST está fundamentalmente centrada en datos (recursos), una arquitectura que use el protocolo SOAP se orienta más hacia los servicios que permiten operar con dichos datos. Con frecuencia se puede caer en el error de pensar que SOAP es también otro tipo de arquitectura; sin embargo, como su nombre indica es un protocolo, por lo que restringe más su posible implementación y a cambio está más estandarizado. Esto tiene especial relevancia en el tipo de mensajes que los servidores envían o reciben: Los clientes REST envían información generalmente en HTML o XML, mientras que una implementación con SOAP se decanta normalmente por el último; teniendo un fuerte tipado, con un lenguaje más verboso que JSON –muy extendido en servicios que implementan arquitecturas REST– y demandando un mayor ancho de banda por transmisión.

Por otra parte, los servicios REST deben poder ser probados mediante un navegador para poder ser RESTful, por lo que el propio servicio debe controlar si devuelve un contenido solo amigable para las máquinas o una presentación también legible para humanos en función del contexto. Para probar una implementación de SOAP, se hace necesario el uso de herramientas ad-hoc como la conocida SoapUI. Además, el uso de bibliotecas está más extendido en esta última opción, quedando REST reservado únicamente para las URIs que representan los recursos como se ha descrito anteriormente.

REST se basa en el principio de lectura como operación más frecuente, por lo que la mayor parte de las peticiones serán de tipo GET; mientras que SOAP está más construido con peticiones POST. Debido a esto último y a unos recursos inespecíficos, SOAP puede conllevar el desarrollo de clientes más complejos que los que se podrían construir con servicios REST.

Como toda propuesta arquitectónica, su adopción se debe evaluar de forma holística con respecto al balance de beneficios-costes cuya implementación puede conllevar. Si bien es cierto que a día de hoy gran parte de APIs –en especial las públicas o abiertas a su consumo por terceras partes– se diseñan para ser REST o RESTful y, por lo tanto, hay cierto consenso en los programadores sobre qué esperar, la estandarización del protocolo SOAP a nivel de implementación hace fácil desentenderse de muchas decisiones que en REST quedan abiertas. Por otro lado, la visibilidad a la que están expuestas las URIs públicas puede suponer un problema de seguridad, además de las limitaciones técnicas por la longitud máxima de los parámetros. Esto último se puede solucionar con solicitudes POST, que SOAP recomienda de forma habitual, y es especialmente útil en el caso de enviar gran cantidad de información o datos binarios. Por lo general, REST puede ser una solución algo más sencilla de implementar en cliente y servidor, con muchos frameworks ofreciéndolo por defecto out-of-the-box, como el caso de Django. Sin embargo, SOAP puede ahorrar decisiones sobre detalles de implementación y ofrecer operaciones de forma más transparente al cliente, publicando los servicios concretos disponibles en un endpoint dado, en lugar de las abstracciones de los datos.

Dado que la definición de REST es muy amplia, es posible afirmar que existe un enorme número de aplicaciones REST en la red (prácticamente cualquier cosa accesible mediante una petición HTTP GET). De forma más restrictiva, en contraposición a los servicios web y el RPC, REST se puede encontrar en diferentes áreas de la web:

Probablemente existan muchas otras implementaciones similares.

En cualquier caso debe tenerse en cuenta que muchas de las implementaciones descritas arriba, no son totalmente RESTful, esto es, no respetan todas las restricciones que impone la arquitectura REST. Sin embargo todas están inspiradas en REST y respetan los aspectos más significativos y restrictivos de su arquitectura, en particular la restricción de "interfaz uniforme". Estos servicios han sido denominados "Accidentalmente RESTful".



Escribe un comentario o lo que quieras sobre Transferencia de Estado Representacional (directo, no tienes que registrarte)


Comentarios
(de más nuevos a más antiguos)


Aún no hay comentarios, ¡deja el primero!