La Transferencia
de Estado Representacional (Representational State Transfer) o REST es
una técnica de arquitectura software para sistemas hipermedia distribuidos como la World
Wide Web.
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 web simple que utiliza XML y HTTP, sin las
abstracciones adicionales de los protocolos basados en patrones de intercambio
de mensajes como el protocolo de servicios web 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 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; los defensores más acérrimos de
REST se llaman a sí mismos RESTafaris.
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 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 sontípicamente HTML o XML. Como resultado de esto, es posible navegar de un
recurso REST a muchos otros, simplemente siguiendo enlaces sin requerir el uso
de registros u otra infraestructura adicional.
Una aplicación
web REST requiere un enfoque de diseño diferente a una
aplicación basada en 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:
·
getUser()
·
addUser()
·
removeUser()
·
updateUser()
·
getLocation()
·
addLocation()
·
removeLocation()
·
updateLocation()
·
listUsers()
·
listLocations()
·
findLocation()
·
findUser()
En REST, al contrario, el énfasis se pone en
la diversidad de recursos, o los nombres; por ejemplo, una
aplicación REST podría definir los siguientes tipos de recursos:
·
Usuario
{}
·
Localización
{}
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:
<usuario>
<nombre>María Juana</nombre>
<sexo>mujer</sexo>
<localización
href="http://www.example.org/locations/us/ny/new_york_city">Nueva
York, NY, US</localización>
</usuario>
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 no
proporcionan ningún recurso 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.
Cabe destacar que REST no es un estándar como lo menciona Jose Montilla, ya que es tan solo un estilo de arquitectura, aunque REST no es un estándar, está basado en estándares: HTTP, URL, Representación de los recursos: XML/HTML/GIF/JPEG/, Tipos MIME: text/xml, text/html.
ResponderEliminar