¿Qué Es Un Servicio Web RESTful?
La sigla REST significa REpresentational State Transfer y en mis traducciones significaríaTransferencia De Estado Representacional.
Como dije anteriormente REST es un estilo de arquitectura. Dio luz por primera vez en un consolidado de Roy Thomas Fielding en la Universidad de California para explicar un nuevo enfoque de la transferencia de recursos entre clientes y servidores a través de HTTP.
Este estilo se enfoca en el recurso como unidad fundamental de los servicios web y estandariza de forma amigable su transferencia entre aplicaciones.
Un recurso es todo aquello relacionado con datos que interesen para comunicar. Puede referirse a un registro de la base de datos como lo sería cada contacto.
De forma extendida un conjunto de recursos del mismo tipo se les llama colecciones. Por lo que al obtener un conjunto de contactos estaríamos hablando de una colección.
Formato de datos para la transferencia
Es muy común que un servicio web RESTful ofrezca distintos formatos para la comunicación de datos. Los más frecuentes son Json y XML, sin embargo pueden usarse distintas variedades como HTML, CSV, PDF, etc.
Recuerda que la cabecera Content-Type
se basa en un registro estándar de tipos llamadosMIME TYPES. Simplemente son valores de texto asociados a un significado predefinido por las regulaciones de la web para usarse como la manera correcta de representar datos.
Para Json la cabecera se define con el siguiente tipo.
Content-Type: application/json
Y para XML con:
Content-Type: text/xml
Normalmente el formato se especifica en la cabecera de tipo de contenido, pero también es posible usarlo a través de parámetros en la url como se mostraba en la API de Twitter.
Operaciones de datos con los métodos HTTP
En REST cada uno de los verbos que se usan en las peticiones equivale a una acción sobre un registro o colección.
Como ya sabes, las acciones más frecuentes se representan en la sigla CRUD (create, read, update y delete). Estas cuatro operaciones básicas tienen asignados los siguientes métodos:
Método | Acción | Seguro | Idempotente |
---|---|---|---|
GET |
Obtiene un recurso o una colección | Si | Si |
POST |
Crea un nuevo recurso | No | No |
PUT |
Actualiza un recurso específico | No | Si |
DELETE |
Elimina un recurso específico | No | Si |
PATCH |
Actualiza parcialmente un recurso especifico | No | No |
La columna Seguro indica si el método no es propenso a la alteración de datos, donde el único que cumple esta condición es GET
debido a que solo obtiene recursos sin ningún cambio. Por el otro lado, la creación, modificación y eliminación se basan en cambiar los recursos, así que son propensos a generar inconsistencias en la base de datos.
Ahora en la columna Idempotente se especifica la capacidad de un método para no repetir una misma acción. Por ejemplo, DELETE
es idempotente ya que al eliminarse un recurso no es posible volverlo a hacer.
En contraste, POST
puede crear un nuevo recurso y si es llamado de nuevo, entonces creará otro, por lo que al utilizarlo sucesivamente siempre habrá un efecto.
Utilidad de las cabeceras en servicios RESTful
Recuerda que las cabeceras o headers son componentes de las peticiones y respuestas para expresar configuraciones asociadas a cada operación.
Aunque existe una gran lista de ellas con distintos propósitos, me gustaría enfocarme en la importancia de la autorización y el almacenaminento en cache.
Autorización— Recuerda que la autorización es la entrega de permisos a un usuario para que acceda a un recurso luego de comprobar la validez de sus credenciales (Autenticación).
A través de la cabecera Authorization
es posible enviar las credenciales del usuario, una clave única de acceso a la API, un token de autorización, etc. Todo depende del tipo de autenticación que vayas a realizar.
Un ejemplo de esta cabecera sería el siguiente. En él ves cómo se envía una clave en la petición del cliente para que el servidor otorgue los permisos necesarios.
Authorization: QWxhZGRpbjpvcGVuIHNlc2FtZQ
Si usas Php podrás obtener el conteido de las cabeceras con getallheaders()
o el método apache_response_headers()
. Luego puedes extraer el contenido de la autorización con la clave ‘authorization’ y realizar una validación.
En nuestro caso usaremos la generación de una clave manual a través de los encriptados de Php para no extender el artículo. Sin embargo tú puedes elegir frameworks de manejo de autorización, el protocolo abierto de seguridad OAuth 2.0 o servicios como Stormpath.
Caching— Con las cabeceras de cache podemos mejorar el rendimiento de un servicio web RESTful cuando este recibe volúmenes grandes de peticiones.
Aunque la aplicación de este concepto no lo veremos en este artículo, puedes hacerte una idea con un ejemplo del uso de los headers.
Supón que a través de una petición GET
hacia los contactos hemos obtenido una lista de 100 registros. Pasado un tiempo la aplicación Android intenta refrescar los registros obtenidos enviando de nuevo una petición GET.
El comportamiento más básico sería dejar que el servicio web envíe de nuevo los 100 registros para comparar cuáles han cambiado y así actualizar la vista.
Pero ¿y si la respuesta no ha cambiado?… ¿es posible usar la caché para optimizar el rendimiento?
Por supuesto. Si marcas el recurso o colección con su último estado y envías este dato en la cabecera Last-Modified
(última fecha de actualización) o ETag
(última representación hash del recurso), podrás comparar la versión actual con la anterior y determinar si es necesario realizar un proceso de actualización. Con ello evitarás cargas excesivas de trabajo.
En este caso el servidor REST podría enviar un estado 304
de “No modified” sin ningún contenido en el cuerpo que sobrecargue el ancho de banda.