Seguimos con Crystal + Kemal. Podemos simular una API para gestionar usuarios en memoria:
require "kemal"
require "json"
struct User
property id : Int32
property name : String
end
users = [
User.new(id: 1, name: "Alice"),
User.new(id: 2, name: "Bob")
]
get "/users" do
users.to_json
end
get "/users/:id" do |env|
id = env.params.url["id"].to_i
user = users.find { |u| u.id == id }
if user
user.to_json
else
env.response.status_code = 404
{ error: "User not found" }.to_json
end
end
Kemal.run
Con solo unas líneas, tenés una API REST rápida y compilada a código nativo.
Kemal permite agregar middlewares personalizados para logging, autenticación o cabeceras:
before_all do |env|
puts "Request: #{env.request.method} #{env.request.path}"
end
También incluye un middleware logger integrado:
add_handler Kemal::Logger.new
Gracias al modelo de fibers de Crystal, Kemal puede manejar múltiples requests concurrentes sin bloquear el hilo principal.
Esto lo hace ideal para APIs I/O-bound (por ejemplo, servicios que consultan bases de datos o APIs externas).
get "/async" do
spawn do
sleep 1
puts "Tarea asíncrona completada"
end
"Procesando..."
end
Kemal es un ejemplo perfecto del espíritu de Crystal:
- Sintaxis clara y expresiva.
- Ejecución compilada, rápida y eficiente.
- Concurrencia simple y no bloqueante.
- Framework minimalista y productivo.
Si te gusta Sinatra en Ruby o Express en Node.js, vas a sentirte como en casa, pero con el rendimiento de un lenguaje compilado.
