Servicios Web REST en Symfony

symfony_restLos servicios web nacieron por la necesidad de permitir a diferentes aplicaciones, desarrolladas en diferentes lenguajes de programación, con diferentes arquitecturas poder compartir información. El truco para lograr esto consiste en utilizar tecnologías, comunes y estándares. Actualmente hay varias formas ya definidas en las que se pueden implementar servicios web, de las cuales quiero destacar dos sin profundizar mucho en el tema: SOAP y REST.

SOAP (Simple Object Access Protocol)

La idea fundamental de SOAP consiste en definir una comunicación mediante el protocolo http el intercambio de archivos XML, en los cuales se define como y cuando se consulta, se crea, se modifica y elimina la información.

REST (Representational State Transfer)

REST al igual que SOAP, utilizan el protocolo http, pero de una forma mas purista, normalmente en REST se define una URI (uniform resource identifier) en la cual mediante los verbos disponibles en HTTP (GET, POST, PUT, DELETE) Se consulta, se crea, se modifica y se elimina la información. Adicionalmente la comunicación entre aplicativos puede darse de cualquier manera, lo mas común es XML y JSON.

REST y Symfony

Recomiendo que tenga un conocimiento básico de Symfony y leer un poco mas acerca de REST y su filosofía en general, bueno, sin mas preámbulo voy a explicar como implementar servicios REST en Symfony.

1. Instalar Symfony y crear un proyecto para la prueba

Para instalar Symfony vamos a descargar la herramienta symfony, siguiendo las instrucciones de la pagina oficial.

por consola ejecutamos el comando: $ php symfony new nombre_proyecto (cabe decir que en mi caso lo quize llamar REST_TEST como se puede apreciar en las dos siguientes imagenes)

symfony_rest_console1 symfony_rest_console2

2. Instalar librería FOS/RESTBUNDLE

Este bundle es el que permite ocurra la magia de REST, en este se encuentran las funcionalidades basicas que una aplicación REST deberia de soporta. Destaco principalmente 2, gestión de headers http (por ejemplo para versionamiento del servicio) y múltiples tipos de respuestas, es decir, que nos responda HTML, JSON, XML según las necesidades del aplicativo cliente. Para mas información acerca de este bundle revisa el siguiente enlace: FosRestBundle.

Symfony utiliza composer para la instalación de muchos bundles y este es uno de ellos. Una vez instalado composer procedemos a ejecutar el siguiente comando por consola en la raíz de nuestro proyecto creado en el punto anterior.

$ composer require friendsofsymfony/rest-bundle

symfony_rest_console3

Una vez instalado debemos activarlo en nuestro kernel, es decir en el archivo app/AppKernel.php agregamos la siguiente linea:

new FOS\RestBundle\FOSRestBundle(),

symfony_rest_text1

3. Configurar el Serializer

Para poder dar respuestas en multiples formatos, es necesario utilizar algún serializer, FOSRestBundle nos da tres opciones: Utilizar el serializer de Symfony, el serializer JMSSerializerBundle o uno personalizado. Personalmente prefiero utilizar el serializer que trae symfony y por ello lo explicaré aqui, basado en la documentación oficial http://symfony.com/doc/current/cookbook/serializer.html.

Simplemente vamos a app/config/config.yml y adicionamos enabled:true bajo la llave serializer de framework. Lo hacemos de la siguiente manera:

4. Configurar el Format Listener.

Debemos configurar FOSRestBundle para que dadas ciertas reglas prefiera ciertos formatos. En mi caso en particular estoy interesado en que todo lo que se coloque en la ruta /api/* sea retornado solo como JSON o XML, en caso de otra ruta, se retorne de forma normal, por consiguiente en el archivo app/config/config.yml agrego las siguientes lineas:

symfony_rest_text4

Para mayor información consulta la documentación oficial.

Felicitaciones, con esto ya tenemos Symfony configurado en el mundo de REST.

5. Prueba de funcionamiento

Veamos un ejercicio practico, vamos a crear un servicio que permitirá consultar un usuario en base al identificador (que por cierto es el único y se encuentra estático en el código) y la respuesta solo será XML o JSON y dependerá de la solicitud del aplicativo cliente y si e cliente no selecciona nada, simplemente será JSON.

NOTA: Este ejercicio no trata de generar nada funcional, simplemente mostrar la escencia de REST en Symfony.

En la raiz de nuestro proyecto vamos a generar un nuevo bundle con el comando

$ php app/bin/console generate:bundle

symfony_rest_console4

Una vez creado vas a gregarle el prefijo /api/ a las rutas de nuestro bundle para que las respuestas respeten las reglas del format listener definidas en el punto anterior, por consiguiente vamos a app/config/routing.yml y agregamos prefix:   /api/, el archivo debería quedar asi:

symfony_rest_text5Ahora vamos al DefaultController.php y le indicamos que debe utilizar los siguientes namespaces:

use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\View\View;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

Hacemos que el controlador herede de FOSRestController, configuramos nuestra ruta, en mi caso como utilice annotation, incluyo las siguientes siguientes comentarios:

/**
* @Route(“/usuario/{id}”, requirements={“id” = “\d+”}, defaults={“id” = 1})
* @Method({“GET”})
*/

Finalmente escribo dentro de la función indexAction las siguientes lineas:

$view = View::create();
$view->setData(array(“id”=>$id,”nombre”=>”cristian”));
return $this->handleView($view);

Tu archivo debió quedar de la siguiente manera:

symfony_rest_text3

Listo, eso es todo. Para probar nuestro servicio web recomiendo utilizar RestClient  para firefox, a continuación un par de resultados de mi servicio:

symfony_rest_web1 symfony_rest_web2

Conclusiones

  • Symfony apoyado con FOSRestBundle, es una excelente solución para prestar servicios REST como aplicación backend.
  • Esta es solo un punto de inicio para gestionar servicios REST en Symfony, obviamente las posibilidades son muchas.

Espero que te diviertas indagando en el mundo de Symfony con REST.

¡No se olvide de dejar un comentario!

4 thoughts on “Servicios Web REST en Symfony

  1. Es genial, sencillo, rápido, al grano.
    Gracias.

    Pero tengo un problema, al ir a probarlo me dice:
    “message”: “Fatal error: Call to undefined method IP\RestBundle\Controller\DefaultController::handleView()”,

    Por más que Googleo no encuentro la solución.
    Alguna ayuda por favor?

    Gracias de antemano

  2. interesante artículo solo tengo una inquietud al utilizar FosRestBundle tengo que utilizar obligatoriamente la notación de FosRest para la configuración de rutas y métodos o también se puede utilizar la de el archivo routing de symfony??

    • Es en conjunto, en la llave fos_rest del archivo de configuración se indica de una forma general como FOSRestBundle va a comportarse segun la ruta (el formato de respuesta JSON,XML,HTML y las rutas con sus respectivas prioridades) y en los archivos de routing o metadata de routing de cada controlador se debe tener la ruta especifica de cada servicio.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>