Conhecendo Phoenix: primeira API
Inicializando nosso projeto.
Primeiro, rodaremos o seguinte comando para gerarmos um novo projeto Phoenix sem HTML, visto que nosso projeto não deverá renderizar conteúdos estáticos.
mix phx.new busi_api --no-html
cd busi_api
Configurando nossa conexão ao banco de dados
config: busi_api, BusiApi.Repo,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "busi_api_dev",
hostname: "localhost",
pool_size: 10
Aqui, configuramos o username, password e hostname com os nomes padrões do Postgres. Voltando ao terminal, vamos rodar os seguintes comandos para criar nossa DB e iniciar o servidor.
mix ecto.create
mix phx.server
Veremos o erro no route found for GET / (BusiApiWeb.Router)
, isso é porque ainda não temos nenhuma rota configurada. No nosso router.ex, vamos adicionar a seguinte parte de código, e depois criar o DefaultController
#/lib/busi_api_web/router.ex
scope "/" do
pipe_through [:fetch_session, :protect_from_forgery]
live_dashboard "/dashboard", metrics: BusiApiWeb.Telemetry
end
#/lib/busi_api_web/controllers/default_controller.ex:
defmodule BusiApiWeb.DefaultController do
use BusiApiWeb, :controller
def index(conn, _params) do
text conn, "BusiApi!"
end
end
Ao recarregarmos a página, deveremos ver o texto "BusiApi!"
na tela.
Criando nossa primeira API JSON
Para criarmos nosso model da API JSON, rodaremos o seguinte comando:
mix phx.gen.json Directory Business businesses name:string description:text tag:string
Esse comando criará uma série de arquivos, incluindo um controller, as migrations e os arguivos de teste. Após rodarmos esse comando, o Phoenix pedirá para adicionarmos o resource na nossa lib/busi_api_web/router.ex e rodaremos o comando mix ecto.migrate
scope "/api", BusiApiWeb do
pipe_through :api
resources "/businesses", BusinessController, except: [:new, :edit]
end
Antes de testarmos nossa API, vamos adicionar alguns valores iniciais. Abra priv/repo/seeds.exs e adicione os seguintes valores:
alias BusiApi.Repo
alias BusiApi.Directory.Business
Repo.insert! %Business{name: "Company 1", description: "short description...", tag: "IT, software"}
Repo.insert! %Business{name: "Company 2", description: "Short description...", tag: "Marketing"}
Repo.insert! %Business{name: "Company 3", description: "Short description...", tag: "Accounting"}
Agora rodamos o comando mix run priv/repo/seeds.exs para adicionarmos os valores à tabela. Restarte o server para vermos os registros JSON. Nós também podemos testar nossa API com o postman fazendo uma requisição do tipo POST
para a url: http://localhost:4000/api/businesses
{
“business”:
{
“name”: “Yet another company”,
“description”: “Another short description!”,
“tag”: “IT”
}
}
Vamos começar com nosso BusinessController, nesse caso list_businesses() retorna todos os registros.
def list_businesses do
Repo.all(Business)
end
Na segunda parte, criaremos um sistema de autenticação com Guardian and Comeonin.