Press enter to see results or esc to cancel.

Criando APIs usando Grape

E ae..

Bom APIs são necessárias por várias razões, como por aplicativos móveis para interagir com operações CRUD backend certo?

Estou trabalhando em um sistema rails no qual tem um aplicativo mobile que precisa se conectar com esse sistema para exibir informações e envia-las e neste tutorial vou mostrar a forma que resolvi isso usando a gem Grape.

Projeto

Nós estaremos usando Rails e grape juntos para criar a API. Vamos supor que na minha aplicação Rails tem uma lista de funcionários e preciso que pelo aplicativo eu consiga, criar, editar, atualizar e excluir funcionários.

Nossa API terá essas rotas:

//Listará todos os funcionários 
GET /employee       

//Add um funcionário
POST /employee/  {name:"Jamal", address:"Brasília, Brasil", age:"27"}             

//Deleta um funcionário
DELETE /employee/1

//Atualiza um funcionário
PUT /employee/1

Começando

Vamos começar criando nossa aplicação Rails e instalar a gem grape. Eu estou usando Rails 4.2.0.

Crie um novo projeto Rails.

rails new employee_api --skip-bundle

Uma vez que os arquivos do projeto são criados, navegue até o diretório do projeto (employee_api). Abra o Gemfile e incluem a gem grape no final do arquivo.

gem 'grape'

Em seguida, instale todas as gems necessárias usando Bundler:

bundle install

Crie um model de Funcionários para as operações CRUD básicas para ser exposto pela API:

rails g model EmpData name:string address:string age:integer
rake db:migrate

Todos os arquivos da API vai estar dentro da pasta app . Crie uma nova pasta chamada api dentro employee_api / app /.

Dentro employee_api / app / api criar uma outra pasta chamada employee, e um arquivo nessa pasta chamado data.rb. Este arquivo contém a classe para acessar o model de funcionários.

Dentro employee_api / app / api / crie um outro arquivo chamado api.rb onde vamos montar a classe definida em employee_api / app / api / employee / data.rb.

De acordo com a documentação do Grape no GitHub, uma vez que colocamos nossa api dentro da pasta app/api, precisaremos dizer a nossa a aplicação aonde esta o código da nossa api.

Então configure o arquivo  config/application.rb como mostrado abaixo:

require File.expand_path('../boot', __FILE__)

require 'rails/all'

Bundler.require(*Rails.groups)

module EmpApi
  class Application < Rails::Application
    ## Add caminho API 
    config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
    config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
  end
end

Criando a API

Vamos começar criando o primeiro caminho da API que neste caso listará todos os funcionários. Para isso abra o arquivo app/api/employee/data.rb e crie a classe, como mostrado abaixo:

module Employee
  class Data < Grape::API

    resource :employee_data do
      desc "List todos Funcionários"

      get do
        EmpData.all
      end

    end

  end
end

Precisamos acessar a classe Employee::Data dentro da nossa API. Então, vamos usar o mount para fazer nossa classe Employee::Data acessível dentro da nossa API.

Acessa o arquivo app/api/api.rb  e inclui:

class API < Grape::API
  prefix 'api'
  version 'v1', using: :path
  mount Employee::Data
end

Agora vai em app/config/routes.rb e inclui o seguinte código para criar as rotas de chamadas da nossa API:

Rails.application.routes.draw do
  mount API => '/'
end

Finalmente!! Rode o server:

rails server

Abra um novo terminal e tenta :

curl http://localhost:3000/api/v1/employee_data.json

Você verá [] como resposta, se o banco de dados estiver vazio. Nos ainda não temos como adicionar um novo funcionário, porem vamos da resolver isso agora.

Vamos adicionar mais um caminho na API para criar um novo funcionário. Vamos precisar de determinados valores para criar um novo funcionário, tais como nome, endereço e idade. O grape nos permite definir esses parâmetros como obrigatórios ou opcionais na própria API.

Vai em app/api/employee/data.rb e adicione o seguinte código para criar o caminho para criação de funcionário.

desc "Criar novo funcionário"

params do
  requires :name, type: String
  requires :address, type:String
  requires :age, type:Integer
end

post do
  EmpData.create!({
    name:params[:name],
    address:params[:address],
    age:params[:age]
  })
end

Renicie o servidor e use o curl para criar um novo funcionário:

curl http://localhost:3000/api/v1/employee_data.json -d "name=jamal;address=brasilia;age=27"

Agora, já devemos ter um funcionário:

curl http://localhost:3000/api/v1/employee_data.json

[{"id":1,"name":"jamal","address":"brasilia","age":27,"created_at":"2016-01-08T03:43:49.303Z","updated_at":"2016-01-08T16:43:49.303Z"}]

Imagina a felicidade quando vi essa linha pela primeira vez \o/ outra forma legal pra testar a api em vez do curl no terminal  é o Postman plugin pro chrome.

Para deletar e atualizar um funcionário segue o mesmo padrão.
Para excluir um funcionário precisaremos de sua ID :

# app/api/employee/data.rb

 desc "deletar funcionario"
 params do
   requires :id, type: String
 end
 delete ':id' do
   EmpData.find(params[:id]).destroy!
 end

Reinicie o servidor Rails e testa a API, excluindo o funcionário que criamos anteriormente.

curl -X DELETE http://localhost:3000/api/v1/employee_data/1.json

{"id":1,"name":"jamal","address":"brasilia","age":27,"created_at":"2016-01-08T03:43:49.303Z","updated_at":"2016-01-08T03:43:49.303Z"}

Agora, se você verificar a api, você deve obter uma resposta vazia.

Em seguida, para atualizar, vamos precisar passar o ID do funcionário e os valores a serem atualizados. Adicione o seguinte código para criar um  caminho na API para atualizar o endereço do funcionário:

# app/api/employee/data.rb

desc "atualizar o endereço do funcionário"
params do
  requires :id, type: String
  requires :address, type:String
end
put ':id' do
  EmpData.find(params[:id]).update({
    address:params[:address]
  })
end

Mas não temos um empregado para atualizar. Lembre-se, que deletamos o último empregado, por isso vamos precisar criar um novo, para então atualizá-lo.

Reinicie o servidor e adicione um novo funcionário em primeiro lugar,

curl http://localhost:3000/api/v1/employee_data.json -d "name=rochelle;address=brasilia;age=25"

{"id":2,"name":"rochele","address":"brasilia","age":25,"created_at":"2016-01-08T03:59:54.090Z","updated_at":"2016-01-08T03:59:54.090Z"}

Agora, use o seguinte comando para atualizar o endereço do novo funcionário:

curl -X PUT http://localhost:3000/api/v1/employee_data/2.json -d "address=orlando"

true

\o/

Juntando tudo

Neste tutorial, começamos a criação de um simples CRUD para criar uma API que pode ser usado por aplicações web ricas, como aqueles criados usando angularjs, Backbone.js, etc…

A documentação detalhada do Grape está disponível em sua página  no GitHub.

  • Silas Vasconcelos

    Muito legal cara, gostei muito vou da uma sacada, parabéns!

  • Pedro Costa

    Muito boa a dica. Valeu!

  • Alisson Bruno Santos

    Muito bom o artigo.
    Só uma correção.

    Onde tem:
    uma vez que colocamos nossa api dentro da pasta app/app
    Não seria:
    uma vez que colocamos nossa api dentro da pasta app/api

Matheus Ninaut

Web and Mobile Developer. I make things happen with HTML5, CSS3 and JavaScript. I think Rails is neat, Wordpress is my b*tch and I will trying new adventures with Elixir.