Elixir, con su enfoque funcional y capacidad para manejar concurrencia de manera eficiente, es un lenguaje ideal para aplicaciones web. Si bien Phoenix es el framework más conocido, Plug es una alternativa minimalista perfecta para quienes buscan simplicidad y flexibilidad, similar a lo que Sinatra ofrece en Ruby.
Plug es un conjunto de especificaciones y módulos para construir aplicaciones web en Elixir. Se centra en el manejo de conexiones HTTP y proporciona herramientas básicas para construir rutas y middlewares.
- Minimalista: Perfecto para aplicaciones simples o como base para proyectos más grandes.
- Rápido: Aprovecha Cowboy, un servidor HTTP eficiente.
- Flexible: Puedes usarlo directamente o integrarlo en frameworks más grandes como Phoenix.
Para comenzar, necesitas agregar Plug y Cowboy a tu proyecto. En el archivo `mix.exs`:
Antes creas el proyecto :
mix new hello_world
Y Luego editamos mix.exs
defp deps do
[
{:plug, "~> 1.13"},
{:plug_cowboy, "~> 2.6"}
]
end
Ejecuta mix deps.get para instalar las dependencias.
Para comenzar a crear Plugs, necesitamos conocer, y adherirse a la especificación Plug. Afortunadamente para nosotros, sólo hay dos funciones necesarias: init/1 y call/2.
Aquí hay un Plug simple que devuelve “Hello World!”:
defmodule Example.HelloWorldPlug do
import Plug.Conn
def init(options), do: options
def call(conn, _opts) do
conn
|> put_resp_content_type("text/plain")
|> send_resp(200, "Hello World!")
end
end
Guarda el archivo en lib/example/hello_world_plug.ex.
La función init/1 se utiliza para inicializar las opciones de nuestros Plugs. Esta es llamada por el árbol de supervisión. De momento, está será una lista vacía que es ignorada.
El valor retornado por la función init/1 eventualmente será pasado a call/2 como su segundo argumento.
La función call/2 es ejecutada por cada petición que viene desde el servidor web, Cowboy. Esta recibe una estructura de conexión %Plug.Conn{} como su primer argumento y se espera que retorne una estructura de conexión %Plug.Conn{}.
Debido a que estamos iniciando nuestra aplicación plug desde cero, necesitamos definir el módulo de la aplicación. Actualiza lib/example.ex para iniciar y supervisar Cowboy:
defmodule Example do
use Application
require Logger
def start(_type, _args) do
children = [
Plug.Adapters.Cowboy.child_spec(:http, Example.HelloWorldPlug, [], port: 8080)
]
Logger.info("Started application")
Supervisor.start_link(children, strategy: :one_for_one)
end
end
Esto supervisa Cowboy, y a su vez, supervisa nuestro HelloWorldPlug.
En la petición a Plug.Adapters.Cowboy.child_spec/4, el tercer argumento será pasado a Example.HelloWorldPlug.init/1.
Aún no hemos terminado. Abre mix.exs de nuevo, y busca la función applications. De momento la parte de aplication en mix.exs necesita dos cosas:
- Una lista de aplicaciones de dependencia (cowboy, logger, and plug) que necesintan iniciar, y
- Configuración para nuestra aplicación, la cual también deberá iniciar automáticamente. Vamos a actualizarla para hacerlo:
def application do
[
extra_applications: [:cowboy, :logger, :plug],
mod: {Example, []}
]
end
Estamos listos para probar este servidor web, minimalístico basado en Plug. En la línea de comando ejecuta:
mix run --no-halt
Cuando todo termine de compilar, y el mensaje [info] Started app aparece, abre el explorador web en 127.0.0.1:8080. Este debera de desplegar:
Hello World!
Plug es ideal para quienes buscan simplicidad y control en sus aplicaciones web. Su integración con Cowboy y su flexibilidad lo hacen una excelente opción para proyectos ligeros, APIs o como base para aprender Elixir.