Introdução: Por que C++ para REST API?
C++ é tradicionalmente associado à programação de sistemas, jogos e aplicações de alta carga. No entanto, o C++ moderno (padrões C++17 e C++20) combinado com bibliotecas leves permite criar serviços web rápidos e eficientes. Se você precisa de uma REST API que processe milhares de requisições por segundo com latência mínima, C++ é uma excelente escolha.
Neste artigo, criaremos uma REST API completa em C++ em 30 minutos usando a biblioteca Crow. Este é um mini-framework similar ao Python Flask, mas escrito em C++. Configuraremos rotas, aprenderemos a analisar JSON e retornar respostas.
Passo 1: Configuração do Ambiente e Instalação do Crow
Para trabalhar, precisamos de um compilador com suporte a C++17 (GCC 7+, Clang 5+, MSVC 2019+) e um gerenciador de dependências como vcpkg ou Conan. A maneira mais fácil é baixar o Crow como um arquivo somente de cabeçalho.
1.1 Instalação via vcpkg (recomendado)
Se você tem o vcpkg instalado, execute o comando:
vcpkg install crow
Em seguida, ao compilar, especifique o caminho para as bibliotecas:
g++ main.cpp -std=c++17 -I/caminho/para/vcpkg/installed/x64-linux/include -lpthread -o server
1.2 Instalação manual (somente cabeçalho)
Baixe a versão mais recente do Crow do GitHub. Você só precisa do arquivo crow_all.h (tudo-em-um). Coloque-o na pasta do seu projeto.
Passo 2: Criando um Servidor Simples com Dois Endpoints
Vamos escrever um servidor mínimo que escuta na porta 8080 e responde a requisições GET e POST. Crie um arquivo main.cpp.
2.1 Código Básico do Servidor
#include "crow_all.h"
int main() {
crow::SimpleApp app;
// Endpoint GET: página raiz
CROW_ROUTE(app, "/")([](){
return "Olá, REST API em C++!";
});
// Endpoint GET: /api/status
CROW_ROUTE(app, "/api/status")([](){
crow::json::wvalue response;
response["status"] = "ok";
response["message"] = "Servidor está rodando";
return response;
});
app.port(8080).multithreaded().run();
}
Compile e execute:
g++ main.cpp -std=c++17 -lpthread -o api_server
./api_server
Agora vá para http://localhost:8080/api/status no seu navegador — você verá uma resposta JSON.
Passo 3: Trabalhando com JSON e Manipulando Requisições POST
Uma REST API real envolve receber dados do cliente. Vamos aprender a aceitar JSON no corpo da requisição.
3.1 Endpoint POST para Criar um Usuário
#include "crow_all.h"
#include <string>
#include <unordered_map>
int main() {
crow::SimpleApp app;
// Armazenamento simples em memória (para demonstração)
std::unordered_map<int, std::string> users;
int next_id = 1;
// POST /api/users — criar um usuário
CROW_ROUTE(app, "/api/users").methods("POST"_method)([&](const crow::request& req){
auto body = crow::json::load(req.body);
if (!body || !body.has("name")) {
return crow::response(400, "Campo 'name' ausente");
}
std::string name = body["name"].s();
int id = next_id++;
users[id] = name;
crow::json::wvalue response;
response["id"] = id;
response["name"] = name;
return crow::response(201, response);
});
// GET /api/users/{id} — obter um usuário
CROW_ROUTE(app, "/api/users/<int>")([&](int id){
auto it = users.find(id);
if (it == users.end()) {
return crow::response(404, "Usuário não encontrado");
}
crow::json::wvalue response;
response["id"] = id;
response["name"] = it->second;
return crow::response(respon