Haciendo un  API rails  con Grape

Haciendo un API rails con Grape

Introducción

Ruby es un lenguaje de programación dinámico y de código abierto enfocado en la simplicidad y productividad. Su elegante sintaxis se siente natural al leerla y fácil al escribirla. Fue diseñado y escrito por Yukihiro Matsumoto, se ejecuta en una variedad de plataformas, como Windows, Mac OS y varias versiones de UNIX. tiene características que son similares a las de Smalltalk, Perl y Python.

Hay que entender que ruby es el lenguaje base  mientras que  Rails es un marco de aplicaciones web que incluye todo lo necesario para crear aplicaciones web respaldadas por bases de datos de acuerdo con el patrón Model-View-Controller (MVC). que en conjunto podrás realizar cms interesantes.Probablemente ya haya utilizado muchas de las aplicaciones que se crearon con Ruby on Rails: Basecamp , GitHub , Shopify , Airbnb , Twitch , SoundCloud , Hulu , Zendesk , Square , Highrise , Cookpad .

Esos son solo algunos de los grandes nombres, pero literalmente hay cientos de miles de aplicaciones creadas con el framework, ahora es importante decir que se puede crear un CMS (content management system) en ruby on rails, pero en este apartado nos vamos a enfocar a  la creación de servicios rest que puedan ser consumidos por otras aplicaciones como android, ember o angular o cualquier front que requiera los datos en formato json, hay que comentar que ruby cuenta con un sin fin de gemas que nos ayudan a realizar tareas específicas estas gemas son librerías para crear la aplicación rápidamente , una gema en particular es grape  que nos permite hacer la exposición de los servicios REST.

Ahora vamos viendo que necesitamos para crear una aplicación primero que nada es la instalación de ruby y rails

¿Qué es Grape?

La instalación de la gema de Grape en una aplicación de Rails  nos permite usar el DSL de Grape para construir fácilmente una API desde nuestro backend. A partir de entonces, cualquier cliente web puede, a través de solicitudes HTTP, hacer un CRUD de  los datos en nuestra base de datos.

Instalando Ruby on Rails

Desde la pagina   https://www.ruby-lang.org/en/documentation/installation/  nos podemos dar cuenta que existen diferentes formas de instalar ruby  puedes hacerlo de la manera que mas te convenga pero como recomendacion puedes usar  RVM (“Ruby Version Manager”), esto es para tener mas de  alguna version de ruby esto lo puedes optener  desde https://rvm.io/ pero te preguntaras para que  necesito tener mas rubies  esto es por que si alguna persona creo un CMS en una versión en particular puedas ejecutarla y mantener todo el potencial sin estar adaptando el código a la nueva versión.

Comprobamos que la version ruby como en la fig 1.1

Fig. 1.1 verificando la version de ruby.

Ahora instalamos Rails, con  Rubygems, puede instalar todos los Rails y sus dependencias usando el siguiente comando a través de la consola:

gem install rails

Comprobamos la versión de Rails.

Fig. 1.2 verificando la version de rails.

Ya que tenemos verificada las versiones  de Ruby y de Rails

Construyendo la API.

Creamos la aplicación.

Fig. 1.3 creando una nueva aplicación con el comando new de Rails donde Demo es el nombre de nuestro proyecto.

Se crean todos los elementos principales y se instalan todas las gemas   para levantar un proyecto. Ya teniendo el proyecto creado hay que entrar a la carpeta.

Fig. 1.4 Entrando al directorio del proyecto

Ahora corremos el servidor web de Ruby on rails recuerda que por default se levanta y escucha  en el puerto 3000,  si este está ocupado pero es posible levantarse en otro puerto después del comando ponerle rails s  -p 3001 por ejemplo.

 

Fig. 1.5 Levantando el servidor en el puerto 3000 por default

Verificamos Rails en algún navegador web. Y si todo esta bien tendrá una salida como la siguiente. Figura 1.6

Fig. 1.6 Verificando en el navegador si se levanto bien verá esta pantalla.

Para detener el servidor use Ctrl C

Configurando  las gemas

Ahora agregaremos las gemas que vamos a utilizar estas gemas no se agregan por default localizamos el archivo gemfile, estas gemas son las de grape, json y las de mysql que es la base de datos  que vamos a utilizar.

Fig. 1.7 Agregando las gemas al archivo gemfile para que se agreguen al proyecto.

Después de agregarla volvemos a la consola y ejecutamos.

Fig. 1.8 El comando bundle agrega todas las gemas que nos hacían falta agregar y que están agregadas al gemfile.

Si no hay cambios podemos ejecutar Bundle update para que recargue las gemas o  si se agregaron bien continuamos  con nuestra aplicación con Grape que es el punto central y final  de esta artículo.

Pasamos a la base de datos, buscamos y encontramos el archivo siguiente está se encuentra en la carpeta config.

Agregando la base de datos mysql

Fig. 1.9 Archivo Database para la configuración de la base de datos.

Dentro de este archivo configuramos   la base de datos rails genera tres bases de datos una para desarrollo otra para test y una final para producción. Pero por ahora solo nos enfocaremos a la base de desarrollo que es con la que empezamos a construir.

Fig. 1.10 Configuración de la base de datos con host, user y password.

Cuando ya tengamos configurada la base pasamos a crear la tabla y recuerde que ruby on rails corre sobre migraciones esto quiere decir que la tabla se crea en código junto al modelo  y luego la importamos a la base.

 

Fig. 1.11 Creación del modelo con la tabla y sus campos

En este ejemplo creamos el modelo para la tabla productos, pero para enviarla a la base de datos mysql  se utiliza el rake que es otra gema de rake  con create crea la base de datos y migrate pasa la tabla creada en este caso productos

Fig. 1.12 Creamos la base de datos con Rake y migramos nuestra tabla.

Esto nos crea la tabla  en mysql y verificamos que sea correcta la migración

Fig. 1.13  Verificamos si la tabla fue creada con exito desde mysql Workbench

En la carpeta models se crea un archivo producto.rb es necesario configurarlo para que ese modelo vaya a la tabla de productos de la siguiente forma.

Fig. 1.14 Agregamos al modelo el nombre de la tabla que va a consumir.

 

Ahora podemos agregar los datos desde el archivo seed creamos los siguientes arrays en el archivo que esta en las migraciones seed.rb

Fig. 1.15 Agregamos Datos de muestra con seed.

Esto es para agregar datos a la tabla desde la consola ejecutamos para poblar la base esto lo puedes hacer cuando tengas catálogos que son necesarios para que el sistema funcione en este caso solo como ejemplo de como poblar la base de datos.

Fig. 1.16 enviamos los registros a la base de datos

Preparando para servir los webservices

Ahora si vemos cómo exponer esos datos en un json basándonos en este principio nuestro objetivo entonces es poder realizar un correcto versionamiento de los diferentes métodos que tendremos en el API, para esto la idea es tener rutas similares a las siguientes controller/api/v1/productos

Creamos el camino hacia nuestros controladores esto se hace con el archivo base.rb

Fig. 1.17 Archivo base.rb

Y tenemos un segundo archivo base dentro de la carpeta v1 base.rb

Fig. 1.18 Archivo dentro de v1  base.rb

Nos vamos a la carpeta router.rb

Fig. 1.19 Archivo router.rb

Ahora crearemos un archivo defaults, en este  configuramos tanto el formato de salida y los errores que queremos devolver al usuario  y lo agregamos en la carpeta controller.

Fig. 1.20 Configuración del archivo default.

Nos falta serializar la salida de los datos después ejecutamos desde consola la siguiente instrucción

 
Fig. 1.21 Generación del serialize para el modelo productos
Fig. 1.22 Agregamos los campos que  queremos que nos devuelva.

Bueno ya tenemos todo para hacer la exposición de los datos vamos a crear el controlador  de productos para el CRUD (create,read,update,delete), dentro de api/v1  creamos en plural el archivo productos.rb el siguiente archivo agregamos las líneas de código  en la figura 1.23 en la línea 8 nos traeremos todos los registros de la base de datos como nodos  si necesitamos traernos uno en específico en la línea 21 hacemos una búsqueda por id  de la línea 26 a la 25 agregamos un nuevo elemento en esto pedimos los que son requeridos  y en la línea 38 los enviamos a la base de datos y  en la línea 44 retornamos el json que se agregó a  la base

Fig. 1.23  Primera parte del archivo Del controlador de productos la segunda parte esta figura 1.27

Probando los servicios

Usando el Advance Rest client probamos el servicio accediendo a la dirección http://localhost:3000/api/v1/productos nos devuelve en nodos los registros de la base

Fig. 1.24  Resultado de GET Para la tabla Productos

 

Si requerimos traernos un registro en específico http://localhost:3000/api/v1/productos/5  le enviamos el id que necesitamos y nos devuelve el registro.

Fig. 1.25  Resultado de GET Para la tabla Productos por id

Si queremos insertar  un nuevo registro INSERT  le mandamos los datos por POST en formato json como a continuación en la fig. 1.26.

Fig. 1.26  Resultado de POST Para la tabla Productos

La segunda parte del código del controlador está en la figura siguiente el método para actualizar es el PUT  en el cual le enviamos los datos en este caso le enviamos el id que se va actualizar  la variable p_id recibe ese parámetro y lo busca en la base antes de actualizar para asegurar  y retorna el id del producto actualizado.

 Fig. 1.27  Segunda parte del código del controlador donde se expone  la actualización y la eliminación de los datos.

En la siguiente figura se actualiza el el producto  con id= 5

Fig. 1.28  Resultado de PUT  Para la tabla Productos actualizando el Producto con id = 5

Por último el DELETE solo es necesario agregar el id en la ruta   por ejemplo http://localhost:3000/api/v1/productos/5

Fig. 1.29 Resultado de DELETE para el producto con id= 55

 

La construcción de servicios con rails y grape es muy sencilla además rails cuenta con todas las sintaxis de SQL desde invocar un select hasta crear un JOIN dentro de las sintaxis.

 

Bibliografia.

http://guides.rubyonrails.org/

https://www.ruby-lang.org/es/

https://github.com/ruby-grape/grape

https://scotch.io/tutorials/build-a-restful-json-api-with-rails-5-part-one

Tomas del Angel Mujica
Tomas del Angel Mujica

Deja un comentario


*