Uma das bibliotecas mais importantes para começar a estudar para a construção de API's, utilizando o real-MVC, como é considerado no mercado atual. Ele consiste em criar uma interface mais amigável aos desenvolvedores na hora de construir uma API estruturada e com os paradigmas funcionais.
Para instalar, você precisa instalar o hex local para instalar como dependência global (igual o npm e yarn)
$ mix local.hex --force
$ mix archive.install hex phx_new <version> # 1.4.16
Após a instalação, você pode instalar, ao invés de usar o mix new
, você utilizará um comando específico para criar projetos Phoenix:
$ mix phx.new hello_world
Mais informações, consulte a documentação do Phoenix
Todos amamos o uso de ORM para realizarmos consultas no banco de dados, e para isso criou-se a dependência Ecto
, no qual consiste em criar uma interface com schemas para coordenar as tabelas, gerar validações e realizar consultas sem a necessidade de escrever SQL puro. E pasmem, tudo isso utilizando a sintaxe do Elixir:
defmodule MyApp.Schemas.User do
@moduledoc """
Schema representation for `users` table
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, :binary_id, autogenerate: true}
schema "users" do
field :name, :string
field :age, :integer
field :status, :string, default: "inactive"
timestamps()
end
@doc """
Generate changeset for schema using JSON as parameters
"""
def changeset(%__MODULE__{} = schema, attrs) do
schema
|> cast(attrs, [:name, :age, :status])
|> validate_required([:name, :age, :status])
|> validate_inclusion(:status, ~w(active inactive))
end
end
Usando o exemplo acima, temos um schema da tabela users
onde temos 3 campos (sem contar o campo :id
, pois ele é gerado automaticamente).
Além disso, estamos:
- Recebendo campos específicos utilizando a função
cast/2
; - Validando se os campos "castados" não são
nil
ouempty_string
; - Validando se no campos
:status
, os dados inseridos fazem parte do enum de["active", "inactive"]
.
Curiosidade: Esse schema utiliza :binary_id
como ID, o qual é geralmente utilizado pelo Postgres.
Consumir uma api REST pode ser fácil e prazeroso utilizando a biblioteca Tesla. Com pouco esforço é possível contruir clientes flexíveis e poderosos que podem ser utilizados em nossas aplicações a qualquer momento:
defmodule GitHub do
use Tesla
plug Tesla.Middleware.BaseUrl, "https://api.github.com"
plug Tesla.Middleware.Headers, [{"authorization", "token xyz"}]
plug Tesla.Middleware.JSON
def user_repos(login) do
get("/users/" <> login <> "/repos")
end
end
Uma das mais amadas da comunidade sem dúvidas, a biblioteca Floki traz com maestria todas as ferramentas necessárias para o parsing de HTML. Tarefas como escrever um crawler simples ou interpretações complexas podem ser alcançadas facilmente com essa belezinha!!! Ah e tudo isso utilizando seletores css, o que deixa nossa vida ainda mais fácil hehe!
Exemplo
<!doctype html>
<html>
<body>
<section id="content">
<p class="headline">Floki</p>
<span class="headline">Enables search using CSS selectors</span>
<a href="https://github.com/philss/floki">Github page</a>
<span data-model="user">philss</span>
</section>
<a href="https://hex.pm/packages/floki">Hex package</a>
</body>
</html>
{:ok, document} = Floki.parse_document(html)
Floki.find(document, "p.headline")
# => [{"p", [{"class", "headline"}], ["Floki"]}]
document
|> Floki.find("p.headline")
|> Floki.raw_html
# => <p class="headline">Floki</p>