Cómo crear un API usando Ruby on Rails y Heroku

Rails es también un framework que podemos usar para crear nuestras APIs (Aplication Programming Interface), podemos instalarlo con solo lo necesario y a la vez contar con la gran comunidad de Rails. En este tutorial te mostraré como empezar tu API déjandola ya lista para unit test y montada en la nube para que la puedas compartir, así como unos consejos para que la prepares para ataques comunes, documentación y listo, solo te faltará meterle los servicios que desees, vaya la carnita.

Lo primero que vamos a necesitar es que instales una serie de paquetes de software, yo te recomiendo que lo hagas en una máquina virtual o usando contenedores de Docker para no arruinar tu ambiente local. De esta manera, si tu ambiente virtualizado se arruina, puedes borrarlo y crearlo de nuevo rápidamente. Vamos a requerir:

  • Ruby 2.3.4
  • Bundler

Si deseas usar una máquina virtual, te recomiendo que instales Virtualbox como hypervisor, en seguida debes buscar en Vagrant una caja con los paquetes que necesites ya instalados, yo estaré usando esta. Pero puedes usar la que más se adecue a tus necesidades, en este caso podríamos aprovechar que ya viene PostgreSQL instalado, la base de datos que provee Heroku. Te voy a mostrar como dejar tu ambiente listo sin muchos rodeos, si te interesa saber más acerca de la virtualización de ambientes te recomiendo este sitio de tutoriales. Por otro lado si quieres saber más sobre Ruby on Rails, puedes darle una leída aquí.

Instalación y configuración de la máquina virtual:

Estos pasos aunque altamente recomendables te los puedes saltar y pasar directo a la configuración de Ruby on Rails. Para instalar la VM, ejecuta en tu terminal el siguiente comando dentro de un directorio que hayas creado para esto, no importa el nombre que le pongas, se tardará algunos minutos:

> vagrant init bivee/rails; vagrant up --provider virtualbox

Para levantar tu VM ejecuta (cada que quieras volver a usarla)

> vagrant up

Para conectarte con tu VM pon lo siguiente

> vagrant ssh

Si todo salió bien deberás ver el siguiente prompt, lo que significa que ya estás dentro tu máquina virtual:

vagrant@Base-Box ~ $

Crea en vagrant un directorio con el nombre de tu API y en seguida crea un directorio en tu compu con el mismo nombre, para este tutorial estaré usando “universe-api”. Ahora debes sincronizar los folders para que trabajes con tu editor favorito fuera de la VM, vamos a poner las siguientes líneas en el Vagranfile que se generó en el folder que creaste para tu VM:

Sal de tu máquina virtual, reiníciala y vuelve a contarte a ella:

vagrant@Base-Box ~ $ exit

logout...

> vagrant reload

==> default: Attempting graceful shutdown of VM...

> ruby-rails vagrant ssh

vagrant@Base-Box ~ $

Instalación y configuración de Ruby on Rails

Esta imagen viene con Ruby 2.2.2 así que vamos a instalar la versión más actual que Heroku soporta la cual es 2.3.4 (que también es el caso de otras plataformas). Para esto, vamos a usar RVM porque ya viene instalado. Decidir si usar RBENV o RVM es más cuestión de preferencia y los dos cumplen con lo que se quiere: instalar versiones de Ruby y cambiarlas on demand.

Para hacer la instalación ejecuta lo siguiente:

vagrant@Base-Box ~ $ rvm install 2.3.4

verás este mensaje:

Install of ruby-2.3.4 - #complete

Ruby was built without documentation, to build it run: rvm docs generate-ri

vagrant@Base-Box ~ $

Ejecuta el siguiente comando para definir 2.3.4, como la versión por default:

vagrant@Base-Box ~ $ rvm use 2.3.4 --default

En seguida vamos a instalar Rails, este comando nos bajará la última versión:

vagrant@Base-Box ~ $ gem install rails --no-document

Para manejar nuestras dependencias o gemas, vamos a instalar Bundler con el siguiente comando:

vagrant@Base-Box ~ $ gem install bundler

Y ahora sí, tenemos nuestro ambiente local listo para empezar a desarrollar, lo que más nos ha tomado tiempo es la instalación y construcción de la máquina virtual, si quieres reducir estos tiempos considera utilizar Docker.

Creación de tu API

Lo primero que vamos a hacer es crear nuestra aplicación, luego la vamos a subir a Heroku y luego te diré algunos consejos para que los implementes antes de comenzar a codear.

Para crear una API con Rails sin generar todos los archivos de una aplicación full-stack se agrega el prefijo — api de esta manera:

vagrant@Base-Box ~ $ rails new universe-api --api

Si revisas los directorios que definiste en Vangrantfile, verás que tienes una aplicación de Rails creada en tus dos ambientes.

Antes de subir tu API a Heroku, vamos a correr los siguientes comandos para tener una app funcional:

cd universe-api

bundle install

rails db:migrate

rails db:setup

Por lo pronto usaremos sqlite3 como base de datos, pero más adelante puedes modificar la configuración en universe-api/config/database.yml.

Si ejecutamos `rails s` y nos vamos a nuestro navegador veremos la pantalla de bienvenida de RoR, señal que vamos por buen camino. Aún no tenemos ninguna ruta o servicio así que nos mostrará algunos errores, eso por ahora no deberá importarnos.

Para subir tu API a Heroku, primero deberás bajar la interfaz de línea de comandos de la siguiente manera (si estás usando OSX busca aquí los pasos):

sudo add-apt-repository "deb https://cli-assets.heroku.com/branches/stable/apt ./"

curl -L https://cli-assets.heroku.com/apt/release.key | sudo apt-key add -

sudo apt-get update

sudo apt-get install heroku

Introduce tus credenciales:

vagrant@Base-Box $ heroku login

Enter your Heroku credentials.

Email: ybom.littlecar@medium.com

Password (typing will be hidden):

Logged in as ybom.littlecar@medium.com

Creamos la aplicación en Heroku:

heroku create

A partir de aquí la podemos ver en el dashboard de Heroku también donde podrás modificar tu aplicación y hacer cosas como cambiarle el nombre y añadirle paquetes de software.

Como ya lo he mencionado Heroku usa PostgreSQL por default, entonces para poder subir nuestra aplicación debemos configurarle la base de datos para nuestro ambiente de producción.

1. Añade esa base de datos en el dashboard, seleciona tu aplicación y en seguida, vete al tab de Resources.

2. Da click en Heroku Postgres::Database y elige el plan gratuito.

3. Aquí ya tienes PostgreSQL definido para tu aplicación. Ahora sólo necesitamos saber las credenciales. Da click en Database Credentials y copia el URI.

4. Asegúrate que tu database.yml se ve similar a este:

5. En tu archivo de Gemfile pon la versión de Ruby que estamos usando y también añade la gema de PostgreSQL para que funcione en Heroku

6. Ejecuta en la terminal `bundle install`.

7. Añade un archive llamado Procfile en el root de tu aplicación y añade la línea

web: bundle exec puma -C config/puma.rb

8. Haz commit de tus cambios y tu app ya está lista para ser subida a Heroku.

9. Ejecuta el siguiente comando para hacer push a Heroku:

vagrant@Base-Box ~/universe-api $ git push heroku master

Y listo tenemos nuestra API en Heroku! Apartir de aquí puedes hacer commit y push de tus cambios cuando lo desees.

Preparando tu API para Unit Test

Es importante que antes de seguir, definamos la parte del Unit Test, así cada que creemos un controlador o modelo, se creearan nuestras clases de RSpec.

Añade las siguientes líneas en tu Gemfile en el grupo de development:

# Use RSpec for specs
gem 'rspec-rails', '3.1.0'
# Use Factory Girl for generating random test data
gem 'factory_girl_rails'

Ejecuta bundle, y en seguida ejecuta el instalador de RSpec. Puedes eliminar la carpeta de test ya que no se utilizará.

bin/rails g rspec:install

Añade un modelo para que veas que las especificaciones se están creando.

vagrant@Base-Box ~/universe-api $ rails g scaffold planet name:string position:string

Se va a crear una tabla en la base de datos así que ejecuta la migración:

rails db:migrate

Habilita CORS

Esto lo puedes lograr con la gema `rack-cors` de manera sencilla, agrega `gem ‘rack-cors’` a tu Gemfile, corre bundle y luego añade lo siguiente a tu config/application.rb

Ataques de fuerza bruta

Para proteger tu aplicación de ataques de fuerza bruta, puedes utilizar la gema de `rack-attack` . Añade tu middleweare en config/production.rb, y define la configuración en config/initializers/rack_attack.rb, puedes usar lo siguiente como punto de entrada:

Documenta tu API

Siempre es buena idea mantener documentada tu API, de esta manera los front-end developers podrán utilizarla y saber los servicios disponibles, así como personas que quieran contribuir al código. Una herramienta open-source que pudes utilizar es Swagger, para facilitar la documentación, puedes utilizar la gema swagger-blocks.

Conclusión

¡Bien! Le hemos puesto muchas cosas a nuestra API, sin embargo hay más cosas que le podemos agregar, por ejemplo el manejo de la autenticación y las autorizaciones, en mi siguiente post veremos estos dos temas usando esta misma aplicación. Mientras siéntete libre de agregarle cosas para tener una base.

Recursos: