click
No seu contexto¹, tenha instalado:
Instalação
¹: "contexto" pode ser tanto sua máquina de trabalho, quanto um contêiner Docker (opção smart)
Instalação
Para começar, utilizaremos algumas libs de ruby, chamadas gems:
source 'https://rubygems.org'
gem 'sinatra'
gem 'sinatra-contrib'
gem 'thin'
microframework web
extensões do sinatra
mini servidor web
Gemfile - arquivo manifesto de dependências
bundle install
Em um terminal, rode:
Hello, Sinatra!
require 'sinatra'
require 'sinatra/json'
set :bind, '0.0.0.0' # acesso externo
set :port, 3000 # porta de acesso
get '/' do
json message: 'Hello, Sinatra'
end
server.rb - código do nosso servidor
http GET http://localhost:3000
Em outro terminal, rode:
rota
dado
bundle exec ruby server.rb
Em um terminal, rode:
Usando REST
require 'sinatra'
require 'sinatra/json'
set :bind, '0.0.0.0' # acesso externo
set :port, 3000 # porta de acesso
all_users = []
get '/users' do
json users: all_users
end
post '/users' do
data = JSON.parse(request.body.read)
id = all_users.size + 1
data['user'][:id] = id
all_users << data['user']
json user: data['user']
end
server.rb
dado vindo no corpo da requisição
require 'sinatra'
require 'sinatra/json'
set :bind, '0.0.0.0'
set :port, 3000
all_users = []
get '/users' do
json users: all_users
end
resposta de acordo com REST
Usando REST
require 'sinatra'
require 'sinatra/json'
set :bind, '0.0.0.0'
set :port, 3000
all_users = []
get '/users' do
json users: all_users
end
post '/users' do
data = JSON.parse(request.body.read)
id = all_users.size + 1
data['user'][:id] = id
all_users << data['user']
json user: data['user']
end
server.rb
http POST :3000 < data.json
Em outro terminal, rode:
bundle exec ruby server.rb
Em um terminal, rode:
{
"user": {
"fname": "Joao",
"lname": "Daniel",
"email": "joao@mail.com"
}
}
data.json
Limitações de persistência
O que acontece com os dados quando é necessário reiniciar o servidor?
O que é necessário que aconteça com os dados ao reiniciar o servidor?
Persistência, representação e desacoplamento
# ...
gem 'activerecord'
gem 'sinatra-activerecord'
gem 'sqlite3'
gem 'rake'
Gemfile - linhas a adicionar
bundle install
Em um terminal, rode:
Mais umas gems:
ORM
adaptador Sinatra
adaptador para banco
utilitário de scripts
ORM - Object Relational Mapping
ORM
Objetos Ruby
Representação do BD
tabela | chave-valor
documento | grafo
O activerecords é a ORM e provê desacoplamento entre o servidor e a escolha de banco de dados
Criação de models
activerecords
O activerecords suporta migrations, que são operações ordenadas cronologicamente para determinar a estrutura do banco
Rake
O Rake é um utilitário para a criação de scripts de automação
Inspira-se no Make e contém sua versão do Makefile, o Rakefile
Setup
require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'
require './server'
Rakefile
class User < ActiveRecord::Base
end
models.rb
require 'sinatra'
require 'sinatra/json'
require 'sinatra/activerecord'
require './models'
set :database, 'sqlite3:project-name.sqlite3'
# ...
server.rb
bundle exec rake db:create_migration NAME=create_users_table
Em um terminal, rode:
Setup
db/migrations/<TS>_create_users_table
É preciso preencher o arquivo novo
class CreateUsersTable < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.string :fname
t.string :lname
t.string :email
t.datetime :created_at
t.datetime :updated_at
end
end
end
bundle exec rake db:migrate
Em depois, rode:
bundle exec rake db:create
Em um terminal, rode:
Atualizando o Servidor
server.rb
set :database, 'sqlite3:project-name.sqlite3'
# substitua o restante pelo que segue abaixo
get '/users' do
users = User.all
json users: users
end
get '/users/:id' do
user = User.find(params[:id])
json user: user
end
post '/users' do
user_data = JSON.parse(request.body.read)['user']
user = User.create(user_data)
json user: user
end
delete '/users/:id' do
user = User.find(params[:id])
user.destroy
json user: user
end
devolve todos os registros do banco da entidade User
encontra um registro de User com o id
cria e salva um novo User
deleta do banco aquele registro dado