توليد Swagger/OpenAPI لـ C++: نظرة عامة على الأدوات والمكتبات
نادرًا ما تخلو التطويرات الحديثة لتطبيقات الخادم بلغة C++ من REST API. أصبحت مواصفة OpenAPI (المعروفة سابقًا باسم Swagger) المعيار الصناعي لوصف واجهات التفاعل بين العميل والخادم. ومع ذلك، فإن كتابة الكود يدويًا لمعالجة الطلبات والتحقق من صحة البيانات وتوليد الردود هي عملية شاقة وعرضة للأخطاء. لحسن الحظ، يقدم النظام البيئي لـ C++ العديد من الحلول الناضجة للتوليد التلقائي للكود بناءً على مواصفة OpenAPI. في هذه المقالة، سنستعرض الأدوات الرئيسية ونقاط قوتها ونقدم أمثلة عملية.
1. OpenAPI Generator (openapi-generator.tech)
أداة التوليد العالمية الأكثر شيوعًا لعشرات اللغات، بما في ذلك C++. تدعم OpenAPI 3.0 و3.1. تسمح بتوليد كود الخادم (C++ REST SDK / cpprestsdk, Pistache, Restbed) وكود العميل.
التثبيت
npm install @openapitools/openapi-generator-cli -g# أو عبر Docker:docker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate \ -i /local/petstore.yaml \ -g cpp-restsdk \ -o /local/out/cpp-clientمثال على توليد عميل باستخدام cpprestsdk
لنفترض أن لديك ملف petstore.yaml يصف API لمتجر حيوانات أليفة. بعد التوليد، ستحصل على فئات جاهزة:
#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 << "Pet name: " << pet->getName() << std::endl; }).wait(); return 0;}الإيجابيات: مجتمع ضخم، دعم لأطر عمل متعددة، تطوير نشط.
السلبيات: قد يكون الكود المُولّد زائدًا عن الحاجة، ويتطلب ضبطًا يدويًا لإطار العمل المحدد.
2. oat++ (oatpp.io)
إطار عمل حديث لـ C++ مع دعم مدمج لـ OpenAPI 3.0. على عكس OpenAPI Generator، لا يقوم oat++ بتوليد الكود من المواصفة، بل يسمح لك بتعليق نقاط النهاية المكتوبة بالفعل وتصدير مواصفة OpenAPI تلقائيًا.
مثال على تعليق نقطة نهاية
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);}
// وصف DTODTO(PetDto, FIELD(Int32, id, "id"), FIELD(String, name, "name"), FIELD(String, status, "status"));بعد ذلك، سيقوم oat++ تلقائيًا بتوليد openapi.json في وقت التشغيل. للتوليد الثابت، يتم استخدام أداة oatpp-swagger.
الإيجابيات: نهج أصلي، إطار عمل موحد، توثيق ممتاز، دعم مدمج لـ Swagger UI.
السلبيات: يتطلب استخدام oat++ بالكامل، غير مناسب للمشاريع الحالية التي تستخدم أطر عمل أخرى.
3. Drogon (drogon.org)
إطار عمل ويب غير متزامن عالي الأداء لـ C++17/20. يتضمن وحدة drogon_ctl لتوليد هيكل المشروع وإضافة drogon::OpenApiPlugin للتوليد التلقائي لوثائق OpenAPI 3.0.
مثال على استخدام OpenApiPlugin
#include <drogon/drogon.h>using namespace drogon;
int main() { app().registerController(std::make_shared<PetController>()); app().addPlugin("drogon::OpenApiPlugin", { {"title", "Pet Store API"}, {"version", "1.0.0"} }); app().run();}وحدة التحكم مع التوثيق التلقائي:
class PetController : public HttpController<PetController> {public: MET