Criando uma API com o Sinatra

Vamos rapidamente mostrar os comandos para se criar um banco de dados chamado loja_de_animais no MariaDB (com o conector do MySQL) com uma tabela chamada animais. Em seguida vamos criar uma aplicação sinatra com uma API para criar animais e listar os animais criados.

Criando o banco de dados e tabela (Requer o MariaDB ou MySQL instalado)

Descrição imagem

Os comandos realizados acima, são detalhados abaixo. No primeiro, conecta-se ao banco de dados pelo terminal:

# mysql -uroot -p
Enter password: Sua senha aqui

O comando create database loja_de_animais; cria uma base de dados no MariaDB ou MySQL

MariaDB [(none)]> create database loja_de_animais;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> use loja_de_animais; informa que você deseja usar o banco loja_de_animais.

create table animais(id integer primary key auto_increment, nome varchar(255), tipo varchar(255), raca varchar(255), descricao TEXT); cria a tabela de animais no banco, com as colunas id, nome, tipo, raca e descricao.

Pronto, nosso banco está criado. Agora instalar três pacotes (gems) do Ruby para nossa aplicação: Sinatra (caso já não tenha feito), o ActiveRecord (ORM Ruby para acesso a banco de dados) e o mysql2 (driver do mysql/mariadb que o ActiveRecord vai utilizar). Vamos usar o comando gem install sinatra activerecord mysql2 para instalar todos os pacotes de uma vez. Veja o resultado:

# gem install sinatra activerecord mysql2
Successfully installed sinatra-2.1.0
Successfully installed activerecord-6.1.4
Building native extensions. This could take a while...
Successfully installed mysql2-0.5.3
3 gems installed

Já com o Sinatra, ActiveRecord e mysql2 instalado, vamos agora criar a API em um arquivo chamado animais.rb com rotas para criar (POST /animais) e listar animais (GET /animais) e remover um animal por id (DELETE /animal/:id)

Já com o Sinatra instalado em uma pasta, vamos criar um arquivo com o nome animais.rb com toda a aplicação nele.

require 'sinatra'
require 'active_record'

set :port, 3000

# Estabelece conexão com banco de dados com suas credenciais.
# Só executa uma vez quando a aplicação inicia.
ActiveRecord::Base.establish_connection({
  adapter: 'mysql2',
  host: 'localhost', 
  username: 'USUARIO DO BANCO',
  password: 'SENHA DO BANCO',
  database: 'loja_de_animais'
})

# Essa classe é um Model do ORM ActiveRecord e 
# está configurada para acessar a tabela 'animais'
# Com isso ela consegue manipular essa tabela completamente.
class Animal < ActiveRecord::Base
  self.table_name = 'animais'
end

get '/animais' do
  animais = Animal.all # Utilizando a classe Animal obtem todos os cadastrados no banco
  return animais.to_json # retorn um JSON com todos os animais da base de dados
end

post '/animais' do
  # recebe os dados JSON da requisição convertendo para um objeto Ruby
  dados = JSON.parse(request.body.read)

  animal = Animal.new # Cria uma instância da classe Animal

  # setar o nome, tipo, raca e descricao para os passado no POST
  animal.nome = dados['nome'] 
  animal.tipo = dados['tipo']
  animal.raca = dados['raca']
  animal.descricao = dados['descricao']

  # salva no banco de dados
  animal.save()
  return { message: 'Animal criado com sucesso!', animal: animal }.to_json # Retorna um JSON com os dados do animal salvo
end

# Remove um animal por ID
delete '/animal/:id' do
  #Busca um animal com ID passado na rota como parâmetro do método find
  animal = Animal.find(params['id'])
  animal.destroy() #remove o animal da base de dados
  return { message: "#{animal.nome} foi removido com sucesso" }.to_json
end

A API está criada. Vamos utilizar o Insomnia (pode ser baixado em https://insomnia.rest/) para a acessar e realizar várias operações:

Descrição imagemCadastrando Bruce Wayne (POST http://localhost:3000/animais)

Descrição imagemCadastrando Baleia (POST http://localhost:3000/animais)

Descrição imagemCadastrando Oriosvaldo (POST http://localhost:3000/animais)

Descrição imagemObtendo a lista de animais cadastrados: (GET http://localhost:3000/animais)

Descrição imagemRemovendo um animal por ID: DELETE http://localhost:3000/animal/4

Pronto. Criamos um API do início ao fim, desde o banco de dados, tabela, aplicação com o sinatra e consumimos os dados com o Insomnia realizando as operações de criar animal, listar e remover um animal por ID.

Como você viu utilizamos a biblioteca ActiveRecord dentro do Sinatra para acessar o banco de dados. O ActiveRecord é uma biblioteca originalmente criada para o framework RubyOnRails, mas como é modularizada ela pode ser utilizada fora do Rails, como fizemos aqui. Mas isso não é realmente necessário. Seria possível usar o driver do mysql diretamente no nosso código. Usamos o ActiveRecord somente para ter mais facilidades.


Versão 5.3 - Todos os Direitos reservados