Criando API REST com Rails 5

vicente correia
Jaguaribe Tech
Published in
7 min readAug 20, 2017

A partir da versão 5, o Rails oferece suporte a aplicativos de API, em versões anteriores, era preciso adicionarmos uma gem externa: rails-api, que desde então foi incorporada ao Rails Core.

As aplicações de API são reduzidas em comparação com as aplicações Web Rails tradicionais. De acordo com as notas de versão do Rails 5, a geração de uma aplicação API apenas irá:

  • Iniciar o aplicativo com um conjunto limitado de middleware.
  • Fazer o ApplicationController herdar do ActionController :: API em vez do ActionController :: Base.
  • Ignorar a geração de arquivos de view, isso funciona para gerar uma estrutura centrada na API, excluindo funcionalidades que, de outra forma, não seriam utilizadas e desnecessárias.

Bem, irei mostrar a vocês como montar uma simples API REST e apresentar uma gem para criar dados aleatórios que utilizaremos como exemplo, então, bora lá!

Objetivos

Criar uma API para disponibilizar acesso a um conjunto de artigos, onde poderemos listar todos os artigos, consultar um artigo específico, criar, atualizar e deletar.

Pré-requisitos

  • ruby version ≥ 2.3
  • rails version ≥ 5
  • PostgreSQL

Vamos dar inicio a nossa API

No terminal execute:

$ rails new myartecle --api

Observe que estamos usando o argumento api para dizer ao Rails que queremos um aplicativo de API.

Com nossa aplicação criada, vamos abrir o arquivo de configuração de banco de dados para adicionarmos o postgres, por padrão ele vem com o sqlite3.

myarticles/config/database.yml

Crie um banco de dados no postegres com o nome myarticles

CREATE DATABASE myarticles

Vamos adicionar a dependência da gem do postgres no arquivo Gemfile

myarticles/Gemfile.txt

Instale a gem executando:

$ bundle install

Ok! Banco configurado, agora vamos criar o model do artigo para podermos realizarmos a migração. Esse exemplo é bem simples, criaremos um artigo apenas com um titulo e descrição. Acesse o diretório do aplicativo e execute:

$ rails g model Article title:string body:text

Agora vamos executar a migração para que a tabela seja criada no banco.

$ rails db:migrate

Ok! Tabela criada, que tal validarmos os campos title e body para que eles sejam obrigatórios na hora de inserir no banco? Vamos abrir o arquivo para fazer os ajustes.

myarticles/app/models/article.rb

Chegou a hora de popularmos nosso banco para que tenhamos alguns dados previamente cadastrados, mas eu sou preguiçoso e não quero ter muito trabalho para realizar tal tarefa, eis que trago para vocês uma gem que vai nos ajudar nessa, é a Faker, ela é muito útil para popular nosso banco com dados fictícios e termos uma base repleta de informações para se trabalhar. Como ela será utilizada apenas enquanto estamos em desenvolvimento, vamos configurar a sua dependência no nosso arquivo Gemfile no grupo de desenvolvimento.

myarticles/Gemfile.txt

Instale a gem executando:

$ bundle install

Tudo certo, agora vamos ajustar nosso arquivo de seeds para que ele possa gerar dinamicamente 50 artigos fictícios para o nosso banco.

myarticles/db/seeds.rb

Para saber mais informações sobre a gem fake acesse o github.

Seeds configurado, vamos executar o comando para popular o nosso banco.

$ rails db:seed

Observe que as tabelas foram populadas:

Print da tabela articles no pgAdmin III

Ok! Modelos e dados já estão definidos agora precisamos criar os controllers de modo que essa seria a versão 1 da nossa API, então iremos dividir nosso diretório no projeto para que se futuramente precisarmos atualizar nossa API, os controllers dela, fiquem em um diretório específico da nova versão. Nesse caso vamos criar o diretório api/v1 em myarticles/app/controllers, crie o diretório:

myarticles/app/controllers/api/v1

Com o diretório pronto, vamos criar agora o arquivo do controller, chamaremos de: articles_controller.rb . Dentro do arquivo iremos definir um módulo Api e um módulo para versão v1 e criaremos a classe do módulo que será o controlador dos articles.

Ainda no arquivo articles_controller.rb iremos criar um método index para retornar todos os artigos que estão no nosso banco, ordenados pela data de criação, em formato JSON com uma mensagem de sucesso.

Precisamos adicionar algumas rotas a nossa API, para isso vamos abrir o arquivo routes.rb onde iremos inserir os namespaces necessários e definir nosso recurso que seria os artigos.

myarticles/config/routes.rb

Para que possamos visualizar nossas rotas execute o seguinte comando no seu terminal:

$ rails routes

Teremos como resultado:

Até o momento nos criamos apenas a rota para index no arquivo articles_controller.rb, logo abaixo iremos criar para show, create, update e destroy.

Mas, antes vamos verificar se nossa API está realmente funcionando? Para isso estou utilizado o Postman, que simula as requisições GET, POST, DELETE, PUT entre outras, a instalação é super simples, basta adicionar a extensão dele no seu navegador Google chrome (segue o link). Pronto, já está instalado? Vamos lá então! Primeiro execute o comando para subir o servidor do rails, que pode ser acessado em localhost:3000.

$ rails s

Abra o Postman para fazermos uma requisição do tipo GET e retornar todos os artigos que temos cadastrados, iremos usar a rota:

localhost:3000/api/v1/articles

Com o Postman aberto siga os seguintes passos:

Requisição GET no Postman

1. Escolha o método GET;

2. Informe a rota, que no caso é localhost:3000/api/v1/articles;

3. Click em send, será exibido a lista de artigos do nosso banco!

Vamos criar a rota para mostrar um artigo passando o seu ID, para isso iremos abrir o arquivo articles_controller.rb e adicionar o código para rota show.

Vamos testar no Postman? Siga os mesmos passo da imagem anterior, só mudando a rota e passando o id do artigo que você deseja obter, exemplo de rota:

localhost:3000/api/v1/articles/3

Será exibido uma resposta com um único artigo:

Agora vamos inserir a rota que tem a finalidade de criar um novo artigo, para isso iremos abrir o arquivo articles_controller.rb novamente e adicionar o código da rota create.

Para fazermos a inserção de um novo artigo pelo Postman é um pouco diferente, no método iremos definir como POST e colocar a rota:

localhost:3000/api/v1/articles

No menu Headers o campo key informe Content-Type e o campo value informe application/json

No menu Body selecione a opção raw e informe no formato json os dados do novo artigo que você deseja salvar, como no exemplo da imagem, em seguida clique em Send, será exibido logo abaixo uma mensagem de sucesso e os dados do novo artigo inserido :)

Vamos criar a rota para excluir um artigo? para isso iremos abrir o arquivo articles_controller.rb novamente e adicionar o código da rota destroy.

Para fazermos a exclusão um artigo pelo Postman no método iremos definir como DELETE e colocar a rota com o id do artigo que queremos excluir:

localhost:3000/api/v1/articles/2

Ao clicarmos em Send o artigo será excluído e retornará um mensagem de sucesso com os dados do artigo eliminado.

Agora por último, mas não menos importante, iremos criar a rota para atualizar os dados de um artigo, novamente abriremos o arquivo articles_controller.rb para adicionar o código da rota update.

No Postman, como faríamos para atualizar? Simples, é só definir o método como PUT e colocar a rota com o id do artigo que queremos atualizar:

localhost:3000/api/v1/articles/4

No menu Headers o campo key informe Content-Type e o campo value informe application/json

No menu Body selecione a opção raw e informe no formato json os dados do artigo que você deseja atualizar, como no exemplo da imagem, em seguida clique em Send, será exibido logo abaixo uma mensagem de sucesso e os dados do novo artigo atualizado.

Conclusão

Pronto! Viu como foi simples criar sua API? Ficou show de bola e aprendemos a criar uma API com rails, usar a gem Faker e o Postman. Agora é com você, criar um app com Rails ou em qualquer outra linguagem para consumir essa API. Espero que tenham gostado desse artigo!

O código do projeto está disponível no meu github, para saber mais sobre Rails for API-only Applications acesse o link e até a próxima ;)

--

--