Génération Swagger/OpenAPI pour C++ : aperçu des outils et bibliothèques

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Génération Swagger/OpenAPI pour C++ : aperçu des outils et bibliothèques



Le développement moderne d'applications serveur en C++ se passe rarement d'une API REST. La spécification OpenAPI (anciennement connue sous le nom de Swagger) est devenue la norme industrielle pour décrire les interfaces de communication entre le client et le serveur. Cependant, écrire manuellement le code pour traiter les requêtes, valider les données et générer les réponses est un processus laborieux et sujet aux erreurs. Heureusement, l'écosystème C++ propose plusieurs solutions matures pour la génération automatique de code à partir d'une spécification OpenAPI. Dans cet article, nous passerons en revue les principaux outils, leurs points forts et donnerons des exemples pratiques.



1. OpenAPI Generator (openapi-generator.tech)



Le générateur de code universel le plus populaire pour des dizaines de langages, y compris C++. Prend en charge OpenAPI 3.0 et 3.1. Permet de générer à la fois du code serveur (C++ REST SDK / cpprestsdk, Pistache, Restbed) et du code client.



Installation

npm install @openapitools/openapi-generator-cli -g# ou via Docker :docker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate \  -i /local/petstore.yaml \  -g cpp-restsdk \  -o /local/out/cpp-client


Exemple de génération d'un client avec cpprestsdk

Supposons que vous ayez un fichier petstore.yaml décrivant une API pour une animalerie. Après la génération, vous obtiendrez des classes prêtes à l'emploi :

#include "ApiClient.h"#include "PetApi.h"

int main() { auto client = std::make_shared<ApiClient>(); PetApi api(client);

api.getPetById(1).then([](std::shared_ptr<Pet> pet) { std::cout << "Nom de l'animal : " << pet->getName() << std::endl; }).wait(); return 0;}


Avantages : immense communauté, prise en charge de nombreux frameworks, développement actif.

Inconvénients : le code généré peut être redondant, nécessite un réglage manuel pour le framework spécifique.



2. oat++ (oatpp.io)



Un framework moderne pour C++ avec son propre support d'OpenAPI 3.0. Contrairement à OpenAPI Generator, oat++ ne génère pas de code à partir d'une spécification, mais permet d'annoter des points de terminaison déjà écrits et d'exporter automatiquement une spécification OpenAPI.



Exemple d'annotation d'un point de terminaison

ENDPOINT("GET", "/pets/{petId}", getPetById) {    auto dto = PetDto::createShared();    dto->id = request->getPathVariable("petId");    dto->name = "Rex";    dto->status = "available";    return createDtoResponse(Status::CODE_200, dto);}

// Description du DTODTO(PetDto, FIELD(Int32, id, "id"), FIELD(String, name, "name"), FIELD(String, status, "status"));


Ensuite, oat++ générera automatiquement un fichier openapi.json à l'exécution. Pour la génération statique, l'utilitaire oatpp-swagger est utilisé.



Avantages : approche native, framework unifié, excellente documentation, prise en charge intégrée de Swagger UI.

Inconvénients : nécessite d'utiliser oat++ dans son intégralité, ne convient pas aux projets existants utilisant d'autres frameworks.



3. Drogon (drogon.org)



Un framework web asynchrone haute performance pour C++17/20. Inclut le module drogon_ctl pour générer le squelette d'un projet et le plugin drogon::OpenApiPlugin pour la génération automatique de la documentation OpenAPI 3.0.



Exemple d'utilisation d'OpenApiPlugin

#include <drogon/drogon.h>using namespace drogon;

int main() { app().registerController(std::make_shared<PetController>()); app().addPlugin("drogon::OpenApiPlugin", { {"title", "API Animalerie"}, {"version", "1.0.0"} }); app().run();}


Contrôleur avec auto-documentation :

class PetController : public HttpController<PetController> {public:    MET                    

Recommendations