Uma API REST simples implementada em C puro seguindo os princípios do Pike Style: código claro, direto e eficiente.
- Simplicidade: Código direto, sem abstrações desnecessárias
- Clareza: Nomes de funções e variáveis descritivos
- Eficiência: Uso mínimo de recursos, sem overhead
- Robustez: Tratamento de erros explícito
- Legibilidade: Estrutura linear e fácil de seguir
- libpq-dev: Cliente PostgreSQL
- libcjson-dev: Biblioteca JSON
- postgresql: Servidor de banco de dados
make install-deps-ubuntumake install-deps-fedoramake install-deps-macos- Instalar PostgreSQL (se não estiver instalado)
- Configurar banco:
make setup-db- Ou configurar manualmente:
CREATE DATABASE apidb;
CREATE USER apiuser WITH PASSWORD 'apipass';
GRANT ALL PRIVILEGES ON DATABASE apidb TO apiuser;- Editar configurações no arquivo
main.c:
static db_config_t db_config = {
.host = "localhost",
.port = "5432",
.dbname = "apidb",
.user = "seu_usuario",
.password = "sua_senha"
};# Compilação normal
make
# Compilação para debug
make debug
# Limpeza
make clean# Executar servidor
./api_server
# Ou executar com logs
make runO servidor iniciará na porta 8080.
Verifica status do servidor e conexão com banco.
Resposta:
{
"status": "OK",
"database": "connected"
}Lista todos os usuários.
Resposta:
[
{
"id": "1",
"name": "João Silva",
"email": "joao@email.com",
"created_at": "2025-05-28 10:30:00"
}
]Cria um novo usuário.
Requisição:
{
"name": "Maria Santos",
"email": "maria@email.com"
}Resposta (201):
{
"message": "Usuario criado"
}# Executar testes automatizados
make testOu testes manuais:
# Verificar saúde
curl http://localhost:8080/health
# Criar usuário
curl -X POST -H "Content-Type: application/json" \
-d '{"name":"João","email":"joao@email.com"}' \
http://localhost:8080/users
# Listar usuários
curl http://localhost:8080/users- Funcões pequenas e focadas: Cada função tem uma responsabilidade clara
- Variáveis globais simples: Estado mínimo necessário
- Tratamento de erro explícito: Todos os returns são verificados
- Sem abstrações desnecessárias: Comunicação direta com sockets e PostgreSQL
- Código linear: Fluxo fácil de seguir, de cima para baixo
main()
├── db_init() // Conecta PostgreSQL
├── start_server() // Inicia servidor HTTP
│ ├── accept() // Aceita conexões
│ ├── parse_request() // Parse HTTP
│ ├── handle_request() // Roteamento
│ │ ├── handle_get_users()
│ │ └── handle_post_users()
│ └── create_response() // Monta resposta HTTP
└── db_close() // Cleanup
Para expandir a API mantendo o Pike Style:
Adicione handlers simples no handle_request():
// GET /users/:id
else if (strncmp(req->path, "/users/", 7) == 0) {
char *id = req->path + 7;
char *json_data = get_user_by_id(id);
// ... resposta
}int check_auth(const char *auth_header) {
// Verificação simples de token
return strncmp(auth_header, "Bearer valid_token", 18) == 0;
}void log_request(const char *method, const char *path) {
printf("[%s] %s %s\n", get_timestamp(), method, path);
}- Conexão persistente com PostgreSQL
- Parsing HTTP manual (sem bibliotecas pesadas)
- JSON mínimo apenas para dados necessários
- Memory management explícito
- Validação de entrada rigorosa
- Prepared statements (SQL injection)
- Rate limiting
- HTTPS/TLS
- Headers de segurança
- Sanitização de dados
"Simplicidade é a sofisticação definitiva" - Leonardo da Vinci
Rob Pike defende:
- Clareza sobre esperteza
- Simplicidade sobre complexidade
- Ferramentas pequenas que fazem uma coisa bem
- Código que humanos conseguem entender
Esta API segue esses princípios, priorizando legibilidade e manutenibilidade sobre "features" avançadas.