Translate

jueves, 22 de enero de 2026

APIs Ligeras con Crystal y Kemal parte 2


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.