Api simple con sinatra y ruby
¿Que es Sinatra?
Es un DSL de desarrollo para servicios web por medio de ruby usando protocolos HTTP.
En resumen: Es simple, pero poderoso. =) Y esta apoyado y motivado por Heroku y Github
Requerimientos
- Sólo ruby >= 2.0
Crear proyecto
- mkdir api_sinatra
- touch server.rb
Si, así de sencillo.
Instalar Sinatra
- gem install sinatra
Si, otro paso muy sencillo
Correr aplicación
Posterior a eso en el archivo colocamos lo siguiente:
# server.rb
require 'sinatra'
get '/' do
'Welcome to BookList!'
end
Ahora en la terminal colocar
ruby server.rb
Listo, podremos verificar nuestra aplicación en el navegador
Mysql
Usar código sólo si es necesario, ya que la aplicación conecta y crea la tabla con un usuario si no existe.
CREATE TABLE users ( id smallint unsigned not null auto_increment, name varchar(20) not null, username varchar(20) not null, constraint pk_example primary key (id) );
INSERT INTO users ( id, name, username ) VALUES ( null, 'Sample data' , "brandonVergara");
Creando usuario y validado JSON
post '/users' do
user = User.new(json_params)
if user.save
status 201
else
status 422
body UserSerializer.new(user).to_json
end
end
Ejemplo: borrar un usuario desde la consola.
curl -i -H "Content-Type: application/json" -X DELETE http://localhost:4567/api/v1/users/2
Json no valido
curl -H "Content-Type: application/json" -X POST http://localhost:4567/api/v1/users -d '{"name": "brandon", "username": "postman"'
En seguida deberemos recibir la siguiente respuesta
{"message":"Invalid JSON"}
Helpers
Son funciones desginadas por sinatra para ser utilizadas.
Estos son para el manejo de errores en las solicitudes que llegan, por ejemplo un json corrupto.
helpers do
def base_url
@base_url ||= "#{request.env['rack.url_scheme']}://{request.env['HTTP_HOST']}"
end
def json_params
begin
JSON.parse(request.body.read)
rescue
halt 400, { message:'Invalid JSON' }.to_json
end
end
end
Serializable
Serializamos el objeto para que pueda ser leído por el error http://sinatrarb.com/extensions.html
Borrando un usuario
delete '/users/:id' do |id|
user = User.where(id).first
user.destroy if user
status 204
end
Como regalo por llegar al final del post 🤭
Agregar a nuestro Gemfile la siguiente dependencia:
gem 'sinatra-reloader'
Y finalmente a nuestra aplicación añadir:
#Code..
require 'sinatra/reloader'
#Code..