Introdução: Por que escrever uma REST API em C++?
C++ é tradicionalmente associado à programação de sistemas, jogos e aplicações de alta carga. No entanto, o C++ moderno (a partir dos padrões C++11/17/20) fornece todas as ferramentas necessárias para o desenvolvimento rápido de serviços web. Escrever uma REST API em C++ pode ser justificado quando é necessária máxima performance, baixo consumo de memória ou integração com código C++ existente (por exemplo, bibliotecas de visão computacional ou cálculos numéricos).
Neste guia, criaremos uma REST API completa em C++ em 30 minutos. Para isso, usaremos a biblioteca leve e elegante Crow. Ela não requer configuração complexa, suporta roteamento, JSON (através de json.hpp) e middleware. Ao final do artigo, você terá um servidor funcional com três endpoints.
Passo 1: Configuração do ambiente e instalação do Crow
Para trabalhar, precisaremos de um compilador com suporte a C++17 (g++ 7+, clang 5+ ou MSVC 2017+) e do sistema de build CMake. Crow é uma biblioteca "header-only", o que simplifica a instalação: basta baixar um único arquivo de cabeçalho.
Instalação
- Baixe a versão mais recente do Crow no GitHub (ou use
git clone). - Copie a pasta
includepara o seu projeto. - Instale o
nlohmann/json(também header-only) para trabalhar com JSON.
Estrutura do projeto
my_rest_api/├── CMakeLists.txt├── main.cpp└── include/ ├── crow.h └── json.hppCMakeLists.txt
cmake_minimum_required(VERSION 3.10)project(my_rest_api)
set(CMAKE_CXX_STANDARD 17)
include_directories(include)
add_executable(my_rest_api main.cpp)target_link_libraries(my_rest_api pthread)Build: mkdir build && cd build && cmake .. && make
Passo 2: Criando o servidor básico e as rotas
Crow usa um DSL simples para definir rotas. Vamos criar um servidor que escuta na porta 8080 e processa requisições GET e POST.
Código básico do servidor
#include "crow.h"#include <string>
int main() { crow::SimpleApp app;
// Rota GET simples CROW_ROUTE(app, "/")([](){ return "Bem-vindo à REST API em C++!"; });
// GET com parâmetro de caminho CROW_ROUTE(app, "/user/<int>")([](int user_id){ return crow::response("ID do usuário: " + std::to_string(user_id)); });
app.port(8080).multithreaded().run();}Este código cria dois endpoints. crow::SimpleApp é a classe principal da aplicação. O método multithreaded() ativa o processamento de requisições em um pool de threads. Inicie o servidor e verifique no navegador http://localhost:8080/.
Tipos de parâmetros nas rotas
Crow suporta os seguintes tipos de parâmetros no caminho:
<int>— número inteiro<string>— string<path>— resto do caminho (exemplo:/files/<path>)<float>— número de ponto flutuante
Passo 3: Trabalhando com JSON e requisições POST
Uma REST API de verdade deve ser capaz de receber e retornar JSON. Vamos conectar o nlohmann/json e implementar operações do tipo CRUD.
Exemplo: Um simples "Banco de Dados" em memória
#include "crow.h"#include "json.hpp"#include <unordered_map>#include <memory>
using json = nlohmann::json;
struct Task { int id; std::string title; bool completed;};
std::unordered_map<int, std::shared_ptr<Task>> tasks;int next_id = 1;
int main() { crow::SimpleApp app;
// GET /tasks — obter todas as tarefas CROW_RO