Pular para o conteúdo principal

Operações CRUD

CRUD (Create, Read, Update, Delete) são operações fundamentais no desenvolvimento web. Veja como criar um servidor HTTP mínimo com todos os verbos HTTP usando as bibliotecas mais populares em cada linguagem.

Servidor HTTP Mínimo com 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');
});

Principais Conclusões​

  • Maturidade do framework -- JavaScript (Express), Python (Flask), Go (Gin), Java (Spring Boot) e Ruby (Sinatra) possuem ecossistemas maduros e ricos em convenções, com middleware integrado, validação e integrações com ORM. Por exemplo, Express oferece express.json() e app.post('/items', handler) prontos para uso, enquanto Spring Boot configura automaticamente Tomcat embarcado e injeção de dependência. Em contraste, C com libmicrohttpd requer roteamento manual baseado em strcmp, análise manual de JSON e tratamento customizado de requisição/resposta. Escolha frameworks maduros para entregar APIs rapidamente; considere C apenas para sistemas embarcados ou binários mínimos.

  • Padrões de roteamento -- Roteamento declarativo é a norma: Express usa app.get('/items/:id', ...), Gin usa r.GET("/items/:id", getItem), Flask usa @app.route('/items/<int:item_id>', methods=['GET']) e Sinatra usa get '/items/:id' do. Spring Boot usa anotações como @GetMapping("/{id}") com @PathVariable. Esses padrões mapeiam verbos e caminhos para handlers de forma limpa. C requer um único callback que despacha via strcmp(method, "GET") e strcmp(url, "/items"), o que escala mal. Prefira roteamento declarativo para manutenibilidade e consistência em toda a superfície da sua API.

  • Minimalista vs full-stack -- ASP.NET Core Minimal API e Zig (httpz) enfatizam definições de rota concisas: C# usa app.MapGet("/items/{id}", (int id) => Results.Ok(...)) sem controllers; Zig usa try router.get("/items/:id", getItem, .{}). Spring Boot e Vapor oferecem estruturas completas: Spring fornece @RestController, @RequestMapping, auto-serialização e injeção de dependência; Vapor integra-se com o sistema de tipos do Swift e async/await. APIs minimalistas são adequadas para microsserviços e protótipos; frameworks full-stack são adequados para aplicações grandes com convenções e ferramentas compartilhadas.

  • Ergonomia de requisição/resposta -- A maioria dos frameworks oferece tratamento JSON conveniente: Express com res.json({ message: '...' }), Gin com c.JSON(http.StatusOK, gin.H{...}), Flask com jsonify({'message': '...'}) e C# com Results.Ok(new { message = "..." }). O httpz do Zig requer res.json(.{ .message = "..." }, .{}) explícito e alocação manual de arena para strings formatadas. Escolha frameworks com serialização ergonômica ao construir APIs REST; a abordagem explícita do Zig prioriza controle e previsibilidade sobre conveniência.

  • Extração de parâmetros -- As linguagens diferem em como parâmetros de caminho chegam aos handlers: Python (Flask) usa def get_item(item_id) com conversão de tipo; Go (Gin) usa c.Param("id"); Rust (Actix) usa web::Path<u32> para extração tipada; Java (Spring) usa @PathVariable int id. C e Zig exigem análise manual: req.param("id").? em Zig ou extração de strings de URL em C. Extração tipada reduz bugs e código repetitivo. Prefira frameworks que analisam parâmetros em valores tipados automaticamente.