7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Tools

Desmitificando REST

Scroll to top
Read Time: 15 mins

Spanish (Español) translation by Esther (you can also view the original English article)

No, este no es un artículo que te anime a dormir más. Sin embargo, si esa fue tu primera inclinación, ¡el siguiente texto está hecho para ti! Sin embargo, es una verdad desafortunada que los principios de REST son decididamente complejos. Se han escrito libros enteros sobre el tema. No voy a ser tan presuntuoso como para suponer que puedo fusionar un tema tan intrincado en unos pocos miles de palabras.

Dicho esto, REST, al igual que otras tecnologías, como Git y CSS, es una en la que un poco de comprensión te llevará muy lejos. Para avanzar lo más rápido posible, este artículo se centrará menos en la historia y la filosofía detrás de REST (así como en la diferencia con otras tecnologías, como SOAP), y más en los aspectos prácticos. ¿Cómo puedes implementar la arquitectura REST hoy en día?


¿Qué es REST?

Espera, amigo. Antes de que podamos saltar a algunos ejemplos de código, primero debemos discutir lo que REST, o Representational State Transfer, se refiere.

REST, definido hace más de una década por Roy Fielding en su tesis doctoral, proporciona una forma sencilla de organizar las interacciones entre sistemas, con mayor frecuencia a través de HTTP y el navegador web. En retrospectiva, esta cohesión tiene mucho sentido: ¡Roy es también uno de los principales autores de HTTP!

Hablemos por un momento de las URI. Un URI es esencialmente un identificador para un recurso. Considera el siguiente ejemplo:

Podríamos llamar a esto un recurso. Cuando esta ruta se activa, siguiendo el patrón REST, todos los amigos deben ser recuperados, presumiblemente de una base de datos, y presentados.

Pero, ¿cómo podríamos especificar una solicitud para un solo amigo? Qué tal:

Es fácil de leer, ¿no es así? Ese es uno de los componentes clave de una arquitectura RESTful. Permite estructuras URI, que son igualmente legibles por humanos y máquinas.

Piensa en un recurso como un sustantivo plural. Contactos, estados, usuarios, fotos... todos ellos serían opciones perfectas.

Hasta ahora, tenemos ganchos para identificar una colección, así como un solo elemento dentro de esa colección:

De hecho, verás que estos dos segmentos son todo lo que necesitas. A continuación, podemos aprovechar el poder de HTTP para designar cómo debe responder el servidor a estas URIs. Déjame explicarte:

Cada petición HTTP especifica un método, o verbo, dentro de las cabeceras. Probablemente estés familiarizado con un par de ellos, como GET y POST. Tal vez sea necesario un ejemplo. Abre Google Chrome y navega hasta https://net.tutsplus.com. A continuación, abre las herramientas de desarrollo de Chrome (haciendo clic con el botón derecho del ratón) y consulta la pestaña Red. Es posible que tengas que actualizar la página para ver los distintos activos que se han obtenido. Selecciona el primer elemento de la lista y visualiza las cabeceras.

"Las herramientas para desarrolladores de Google Chrome pueden utilizarse, entre otras cosas, para inspeccionar las cabeceras de una determinada solicitud".

Un momento; aunque no lo hayamos especificado, el método de petición, GET, se ha establecido automáticamente. De esto podemos deducir (querido Watson) que GET es el verbo por defecto, cuando se ven páginas web.

Para cualquier URI, podemos hacer referencia a cuatro métodos de solicitud diferentes: GET, POST, PUT y DELETE.

Básicamente, estos verbos HTTP indican al servidor qué hacer con los datos identificados por la URI. ¿Sigues confundido? ¡Deberías estarlo! Una forma fácil de descifrar estos verbos es compararlos con el acrónimo común CRUD, o Crear-Leer-Actualizar-Borrar.

Hemos establecido que GET es el método de solicitud por defecto, pero seguro que también estás familiarizado con POST. ¿Has creado alguna vez un formulario HTML que, cuando se envía, envía un POST con los datos a tu servidor? Pues bien, cuando ese formulario se envía, el método de solicitud que se utiliza es POST, no GET. Por lo tanto, para, digamos, añadir un nuevo estado a una tabla de tweets dentro de tu base de datos, el formulario debería POST a /tweets, en lugar de algo parecido a /tweets/addNewTweet.php.

De hecho, un indicador de una aplicación no-RESTful es la búsqueda de verbos en el URI. El método de solicitud HTTP debe definir cómo el servidor debe interactuar con la URI, ¡no una masa de archivos PHP sin sentido!

Todos los siguientes representan URIs no-RESTful (y mal diseñados).

Para canalizar mi yo más joven, ¡puaj! No lo hagas. Sin embargo, esto plantea la pregunta: ¿cuál sería el URI correcto para presentar un formulario a un usuario, con el fin de añadir o editar un recurso?

En estas situaciones, tiene sentido añadir dos URI más.

La primera ruta, /friends/new, debería presentar un formulario al usuario para añadir un nuevo amigo. Tras el envío del formulario, se debe utilizar una petición POST, ya que estamos añadiendo un nuevo amigo.

Para el segundo, /friends/joe/edit, este formulario debe utilizarse para editar un registro existente en nuestra base de datos. Cuando se actualiza un recurso, lo apropiado es una solicitud PUT.

¿Te preguntas cómo hacer peticiones PUT desde un formulario HTML? No pierdas la oportunidad.


Verbos

Antes de avanzar con algunos ejemplos concretos de código, vamos a concretar más lo que representa cada uno de estos verbos.

GET

Como se ha señalado anteriormente, GET es el método de solicitud HTTP con el que todos estamos más familiarizados: el verbo por defecto. Una advertencia, o mejor práctica, cuando se trata de solicitudes GET, es que siempre deben ser tratadas como seguras e idempotentes. En otras palabras, una petición GET debe ser de "solo lectura".

Es importante tener en cuenta que, como ingeniero, eres libre de hacer lo que quieras, cuando estas rutas se activan. Nada te prohíbe modificar los datos en el servidor, cuando se activa una solicitud GET. Simplemente es una buena práctica abstenerse de hacerlo.

Un método seguro se refiere a uno que nunca modificará un recurso. El término, idempotente, se refiere a un método que conseguirá el mismo resultado, independientemente de las veces que se solicite. Los tipos de solicitud GET, PUT y DELETE son idempotentes, es decir, si se siguen las reglas.

POST

El segundo método de solicitud con el que probablemente estés familiarizado es el POST. Hoy en día, este tipo se utiliza más a menudo para designar cuando se deben añadir nuevos datos a un recurso. Por ejemplo, al añadir un nuevo amigo, un método POST sería la opción correcta.

PUT

Tradicionalmente, se debe utilizar una petición PUT cuando necesites crear o actualizar un recurso. Sin embargo, quizás como resultado de las convenciones de Ruby on Rails, en la mayoría de las aplicaciones web modernas, PUT se utiliza exclusivamente para actualizar un recurso.

Imaginemos que necesitamos actualizar la edad de nuestro amigo, Joe. Al actualizar su información, a través de un formulario, el método de solicitud correcto sería, PUT.

DELETE

Como habrás adivinado, DELETE debe utilizarse cuando necesites eliminar el recurso identificado por un URI concreto.

Si ya no somos amigos de Susan, siguiendo los principios de REST, puede ser destruida, mediante una petición DELETE.

Una vez ejecutado, todos los datos asociados a Susan deben ser eliminados de la base de datos.


Implementación

Toda esta teoría está muy bien, pero, en última instancia, no sirve de nada si no entendemos cómo aplicar esta arquitectura a nuestros proyectos. Bueno, hay algunas maneras. En la siguiente sección, utilizaremos el popular framework PHP Slim para organizar el enrutamiento necesario, sin embargo, seguramente encontrarás que la mayoría de los frameworks en estos días incluyen alguna forma de integración RESTful, incluyendo Ruby on Rails y Laravel.

Para hacer uso de Slim, el primer paso es instalarlo a través de Composer.

"Composer" es una herramienta para la gestión de dependencias en PHP. Te permite declarar las bibliotecas dependientes que tu proyecto necesita y las instalará en tu proyecto por ti.

Espera, ¿no conoces Composer? Deja lo que estás haciendo ahora mismo e investígalo. Composer nos permite aprovechar la comunidad PHP, especificando e instalando los paquetes que requiere una aplicación. ¡Se acabó el reinventar la rueda!

La instalación global de Composer solo requiere dos comandos rápidos.

¡Eso es todo! Ahora tienes acceso al comando composer.

El siguiente paso es especificar Slim como un paquete necesario para tu aplicación. Esto se puede lograr, a través de un archivo composer.json dentro de la raíz de tu proyecto.

Con este requisito establecido, solo tenemos que ejecutar composer install para descargar las dependencias necesarias. ¡Es muy fácil!

Gracias a unas pocas líneas de código, y a la comunidad PHP, ahora tenemos una forma elegante de registrar rutas. Aquí hay un ejemplo sencillo, que puedes colocar dentro de index.php.

Recuerda: ¡toda esta funcionalidad es gratuita!

"Slim" es un micro framework de PHP que te ayuda a escribir rápidamente aplicaciones web y APIs sencillas pero potentes.

Ahora vamos a configurar las rutas de recursos necesarias. Optaremos por simples sentencias echo para describir qué tipo de acción debe ejecutarse en una aplicación del mundo real.

Cuando usamos Slim, podemos especificar el método de petición al que queremos responder, usando $app->VERB. Así, para borrar al amigo Joe, escucharíamos una petición de delete a /friends/joe, de esta manera:


Rutas de prueba

Si eres como yo, tu siguiente pensamiento podría estar relacionado con cómo se supone que debes probar los métodos PUT y DELETE. Como ya sabrás, la mayoría de los navegadores solo ofrecen soporte nativo para GET y POST. Hacer uso de los otros dos métodos de solicitud requiere un poco de truco, que revisaremos en breve.

Hasta entonces, la forma más fácil de realizar peticiones personalizadas es a través de una extensión de Google Chrome, llamada Advanced Rest Client. Una vez instalada, puedes especificar fácilmente tanto una URI, como el método de solicitud deseado.

"Las extensiones del cliente REST avanzado proporcionan un mecanismo sencillo para probar los URI.

cURL

Si te sientes algo cómodo en la línea de comandos, es recomendable que aproveches el poder de cURL para probar estas rutas.

la bandera X permite especificar el método de solicitud que debe utilizarse. Recuerda que, en el fragmento anterior, estamos siendo explícitos; la bandera X no es necesaria para las peticiones GET, ya que son las predeterminadas.

Aquí hay un ejemplo para probar algunas rutas. Recuerda que estamos usando simples sentencias echo para describir la acción que debe tener lugar.

La modificación de los datos en el servidor requerirá seguramente los nuevos datos (probablemente obtenidos de un formulario). Cuando se utiliza cURL, se pueden especificar pares clave-valor, utilizando la bandera -d, así:

Este comando puede dividirse en tres partes:

  1. ¿Qué es el URI?
  2. ¿Qué método de solicitud debe utilizarse?
  3. ¿Qué datos hay que pasar al servidor?

Utilizando el lenguaje del lado del servidor de tu elección (en nuestro caso, PHP), puedes obtener estos datos POST de la misma manera que lo harías normalmente:

Soporte del navegador

Bien, entendemos cómo especificar un método de solicitud desde la línea de comandos, pero ¿cómo podríamos hacer lo mismo desde un formulario HTML? Desafortunadamente, no podemos confiar en:

Los navegadores actuales no ofrecen soporte nativo para este tipo de peticiones. La solución más común es aplicar un poco de truco, a través de entradas ocultas. Usando el framework Slim, así es como podríamos actualizar a un amigo.

Observa que, técnicamente, el método de solicitud sigue siendo POST. Sin embargo, entre bastidores, Slim leerá el valor de la entrada oculta y procederá en consecuencia, dependiendo del verbo especificado.

Seguramente encontrarás que la mayoría de los frameworks siguen un patrón similar para especificar los tipos de peticiones.

En esta sección, hemos revisado solo la implementación de un framework de enrutamiento con recursos. Sin embargo, como verás, lo mismo es posible en la mayoría de los frameworks hoy en día. Por ejemplo, si eres un artesano de Laravel, entonces podrías utilizar la siguiente sintaxis (a partir de la versión 4):

Este conveniente método de recurso especifica que deseamos generar las rutas necesarias para un recurso de friends, y hacer a FriendsController responsable de manejar la lógica de cada una de estas rutas.


Implementación manual

Si quieres optar por no usar un framework, puedes implementar esta funcionalidad por tu cuenta. Desafortunadamente, escribir el sistema de enrutamiento necesario desde cero está más allá del alcance de este tutorial, sin embargo, aquí hay algunos consejos para que empieces.

En primer lugar, la pregunta más importante: ¿cómo determinamos cuál es el verbo asociado a una solicitud concreta? Si se trabaja a lo largo, crear un nuevo archivo PHP, y añadir:

Si ejecutas esta página en el navegador, la salida debería ser GET. Excelente. Ahora, tenemos los medios necesarios para detectar el método de solicitud, y proceder, según sea necesario.

El siguiente fragmento es decididamente elemental, y requerirá una mejor estructura para tus proyectos, pero puede utilizarse como punto de partida.


Prueba

Hay una variedad de paquetes, que hacen el proceso de escribir pruebas de integración tan simple como sea posible. Sin embargo, vamos a mantenerlo simple y utilizar la biblioteca cURL incorporada de PHP (libcurl) para probar algunas de estas rutas.

El primer paso sería inicializar cURL, y especificar el URI deseado. En nuestro caso, seguiremos probando el recurso friends.

A continuación, a menos que estemos probando el método de solicitud GET por defecto, tendremos que especificar el tipo de solicitud.

Por defecto, esta salida será inmediatamente reproducida. Para devolver la salida a una variable, en lugar de mostrarla directamente, podemos hacer uso del ajuste CURLOPT_RETURNTRANSFER.

¡Con eso debería bastar! Solo tenemos que ejecutar la petición, y obtener los resultados.

PHPUnit

Añadamos esto a un test de PHPUnit, de nuevo, manteniéndolo relativamente simple, por razones de legibilidad. Simplemente nos aseguraremos de que cada ruta devuelva el código de estado 200 adecuado, lo que significa que la solicitud se ha completado con éxito. Para secar las cosas, abstraeremos la funcionalidad de cURL a su propio método, request().

Asumiendo que tienes PHPUnit instalado, ejecuta phpunit friendsTest.php. Si tiene éxito, deberías ver el color verde. Siéntete libre de participar en un baile privado de la victoria.

Para dar un paso más, tiene sentido abstraer ese método request a una clase base que tus pruebas puedan extender. O, mejor aún, deja que una herramienta de terceros altamente probada (y funcional) se encargue del trabajo de campo. Puedes considerar Goutte, que puede instalarse a través de Composer.

Una vez instalado (composer install), podemos ignorar la implementación manual de cURL de antes, y en su lugar hacer uso de la API más limpia de Goutte, como se demuestra a continuación:

No deberías ser la primera persona que considera que estas pruebas son superfluas; sin embargo, te aseguro que, en cuanto el fallo de una de estas pruebas te salve de una tonta metedura de pata, reconocerás al instante su utilidad.


Aprendizaje adicional

Para seguir aprendiendo, la mejor guía para aprender a descansar es cortesía de la gente de Apigee. Su presentación, "Teach a Dog to Rest" (Enseñar a un perro a descansar), recopila una gran cantidad de conocimientos en apenas veinte minutos. Es de visionado obligatorio para todos los principiantes.

"Apigee ofrece una de las introducciones más fáciles de usar a REST en la web.

¡Gracias por leerlo!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.