Introduction : Pourquoi C++ pour une API REST ?
C++ est traditionnellement associé à la programmation système, aux jeux et aux applications à forte charge. Cependant, le C++ moderne (normes C++17 et C++20) combiné à des bibliothèques légères permet de créer des services web rapides et efficaces. Si vous avez besoin d'une API REST qui traite des milliers de requêtes par seconde avec une latence minimale, C++ est un excellent choix.
Dans cet article, nous allons créer en 30 minutes une API REST complète en C++ en utilisant la bibliothèque Crow. C'est un mini-framework, similaire à Python Flask, mais écrit en C++. Nous configurerons les routes, apprendrons à analyser le JSON et à renvoyer des réponses.
Étape 1 : Préparation de l'environnement et installation de Crow
Pour travailler, nous aurons besoin d'un compilateur prenant en charge C++17 (GCC 7+, Clang 5+, MSVC 2019+) et d'un gestionnaire de dépendances vcpkg ou Conan. La façon la plus simple est de télécharger Crow sous forme de fichier d'en-tête (header-only).
1.1 Installation via vcpkg (recommandée)
Si vous avez installé vcpkg, exécutez la commande :
vcpkg install crow
Ensuite, lors de la compilation, indiquez le chemin vers les bibliothèques :
g++ main.cpp -std=c++17 -I/path/to/vcpkg/installed/x64-linux/include -lpthread -o server
1.2 Installation manuelle (header-only)
Téléchargez la dernière version de Crow depuis GitHub. Vous avez seulement besoin du fichier crow_all.h (tout-en-un). Placez-le dans le dossier de votre projet.
Étape 2 : Création d'un serveur simple avec deux endpoints
Écrivons un serveur minimal qui écoute sur le port 8080 et répond aux requêtes GET et POST. Créez un fichier main.cpp.
2.1 Code de base du serveur
#include "crow_all.h"
int main() { crow::SimpleApp app;
// Endpoint GET : page racine CROW_ROUTE(app, "/")([](){ return "Hello, REST API on C++!"; });
// Endpoint GET : /api/status CROW_ROUTE(app, "/api/status")([](){ crow::json::wvalue response; response["status"] = "ok"; response["message"] = "Server is running"; return response; });
app.port(8080).multithreaded().run();}
Compilez et exécutez :
g++ main.cpp -std=c++17 -lpthread -o api_server./api_server
Maintenant, allez dans votre navigateur à l'adresse http://localhost:8080/api/status — vous verrez une réponse JSON.
Étape 3 : Travailler avec JSON et gérer les requêtes POST
Une véritable API REST implique la réception de données du client. Apprenons à accepter du JSON dans le corps de la requête.
3.1 Endpoint POST pour créer un utilisateur
#include "crow_all.h"#include <string>#include <unordered_map>
int main() { crow::SimpleApp app; // Stockage simple en mémoire (pour la démonstration) std::unordered_map<int, std::string> users; int next_id = 1;
// POST /api/users — créer un utilisateur 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, "Missing 'name' field"); } 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} — obtenir un utilisateur CROW_ROUTE(app, "/api/users/<int>")([&](int id){ auto it = users.find(id); if (it == users.end()) { return crow::response(404, "User not found"); } crow::json::wvalue response; response["id"] = id; response["name"] = it->second; return crow::response(respon