Saltar al contenido principal

Operaciones CRUD

CRUD (Crear, Leer, Actualizar, Eliminar) son operaciones fundamentales en el desarrollo web. Así es como se crea un servidor HTTP mínimo con todos los verbos HTTP usando las bibliotecas más populares en cada lenguaje.

Servidor HTTP Mínimo con CRUD​

// Express.js
const express = require('express');
const app = express();
app.use(express.json());

// CREATE - POST
app.post('/items', (req, res) => {
res.status(201).json({ message: 'Item created successfully' });
});

// READ - GET all
app.get('/items', (req, res) => {
res.json({ message: 'Get all items' });
});

// READ - GET one
app.get('/items/:id', (req, res) => {
res.json({ message: `Get item with id: ${req.params.id}` });
});

// UPDATE - PUT
app.put('/items/:id', (req, res) => {
res.json({ message: `Update item with id: ${req.params.id}` });
});

// DELETE
app.delete('/items/:id', (req, res) => {
res.status(204).json({ message: `Delete item with id: ${req.params.id}` });
});

app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});

Puntos Clave​

  • Madurez del framework -- JavaScript (Express), Python (Flask), Go (Gin), Java (Spring Boot) y Ruby (Sinatra) tienen ecosistemas maduros y ricos en convenciones con middleware incorporado, validación e integraciones con ORM. Por ejemplo, Express ofrece express.json() y app.post('/items', handler) directamente, mientras que Spring Boot auto-configura Tomcat embebido e inyección de dependencias. En contraste, C con libmicrohttpd requiere enrutamiento manual basado en strcmp, parseo manual de JSON y manejo personalizado de request/response. Elige frameworks maduros cuando necesites enviar APIs rápidamente; considera C solo para sistemas embebidos o binarios mínimos.

  • Patrones de enrutamiento -- El enrutamiento declarativo es la norma: Express usa app.get('/items/:id', ...), Gin usa r.GET("/items/:id", getItem), Flask usa @app.route('/items/<int:item_id>', methods=['GET']) y Sinatra usa get '/items/:id' do. Spring Boot usa anotaciones como @GetMapping("/{id}") con @PathVariable. Estos patrones mapean verbos y rutas a handlers de forma limpia. C requiere un único callback que despacha mediante strcmp(method, "GET") y strcmp(url, "/items"), lo cual escala mal. Prefiere enrutamiento declarativo para mantenibilidad y consistencia en toda tu superficie de API.

  • Mínimo vs full-stack -- ASP.NET Core Minimal API y Zig (httpz) enfatizan definiciones de ruta concisas: C# usa app.MapGet("/items/{id}", (int id) => Results.Ok(...)) sin controladores; Zig usa try router.get("/items/:id", getItem, .{}). Spring Boot y Vapor ofrecen estructuras con baterías incluidas: Spring proporciona @RestController, @RequestMapping, auto-serialización e inyección de dependencias; Vapor se integra con el sistema de tipos de Swift y async/await. Las APIs mínimas son adecuadas para microservicios y prototipos; los frameworks full-stack son adecuados para aplicaciones grandes con convenciones y herramientas compartidas.

  • Ergonomía de request/response -- La mayoría de los frameworks ofrecen manejo conveniente de JSON: Express con res.json({ message: '...' }), Gin con c.JSON(http.StatusOK, gin.H{...}), Flask con jsonify({'message': '...'}) y C# con Results.Ok(new { message = "..." }). El httpz de Zig requiere res.json(.{ .message = "..." }, .{}) explícito y asignación manual de arena para strings formateados. Elige frameworks con serialización ergonómica cuando construyas APIs REST; el enfoque explícito de Zig prioriza control y previsibilidad sobre conveniencia.

  • Extracción de parámetros -- Los lenguajes difieren en cómo los parámetros de ruta llegan a los handlers: Python (Flask) usa def get_item(item_id) con conversión de tipos; Go (Gin) usa c.Param("id"); Rust (Actix) usa web::Path<u32> para extracción tipada; Java (Spring) usa @PathVariable int id. C y Zig requieren parseo manual: req.param("id").? en Zig o extracción de strings de URL en C. La extracción tipada reduce bugs y código repetitivo. Prefiere frameworks que parseen parámetros a valores tipados automáticamente.