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 back-end 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:

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:

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.

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 :

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:

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, reactjs, vuejs, etc…

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