توليد Swagger/OpenAPI لـ C++: كيفية أتمتة إنشاء REST API
\n\nيتطلب تطوير الويب الحديث بلغة C++ أدوات فعالة لإنشاء REST API. أصبحت مواصفات OpenAPI (المعروفة سابقًا باسم Swagger) معيارًا لوصف واجهات خدمات الويب. ومع ذلك، فإن التوليد التلقائي للكود بلغة C++ بناءً على مواصفات OpenAPI مهمة غير تافهة. في هذه المقالة، سنستعرض أفضل المكتبات والأدوات التي ستساعدك في توليد كود الخادم والعميل بلغة C++ من مستندات OpenAPI.
\n\nلماذا تتخلف لغة C++ عن اللغات الأخرى في توليد OpenAPI؟
\nعلى عكس Python أو Java أو JavaScript، حيث توجد مولدات ناضجة (مثل openapi-generator)، تواجه لغة C++ عدة مشاكل:
- \n
- غياب معيار موحد لأطر HTTP — لا يوجد إطار ويب مهيمن في C++ مثل Flask أو Spring. \n
- صعوبة إدارة الذاكرة — يتطلب توليد كود آمن باستخدام المؤشرات الذكية أنماطًا إضافية. \n
- تنوع الأنواع — يتطلب تسلسل JSON في C++ إعدادًا يدويًا للهياكل المعقدة. \n
الأدوات الرئيسية لتوليد كود C++ من OpenAPI
\n\n1. OpenAPI Generator (المولد الرسمي)
\nالأداة الأكثر شيوعًا هي OpenAPI Generator (المعروفة سابقًا باسم Swagger Codegen). وهي تدعم العديد من اللغات، بما في ذلك C++. ومع ذلك، فإن دعمها لـ C++ محدود: يتم توليد كود العميل فقط بناءً على cpprestsdk (Casablanca) أو Qt.
\nالتثبيت:
\n# عبر npm\nnpm install @openapitools/openapi-generator-cli -g\n\n# توليد عميل C++ (cpprestsdk)\nopenapi-generator generate -i petstore.yaml -g cpp-restsdk -o ./client\nمثال على الكود المولد (Qt):
\n// PetApi.h\nclass PetApi : public AbstractOpenAPISchema {\n Q_OBJECT\npublic:\n explicit PetApi(QObject *parent = nullptr);\n \n void addPet(const Pet &body);\n void getPetById(qint64 petId);\n \nsignals:\n void addPetSignal(Pet &result);\n void getPetByIdSignal(Pet &result);\n};\nالإيجابيات: دعم العديد من التنسيقات، مجتمع نشط.
\nالسلبيات: غالبًا ما يتطلب الكود المولد تحسينات؛ لا يوجد توليد للخادم لـ C++.
2. oat++ (oatpp) — إطار عمل مع دعم OpenAPI
\noat++ هو إطار عمل حديث بلغة C++ لإنشاء REST API، ويتضمن دعمًا مدمجًا لـ OpenAPI. على عكس المولدات، يستخدم oat++ نهجًا تصريحيًا مع التعليقات التوضيحية.
\nمثال على وصف نقطة النهاية:
\nENDPOINT("GET", "/users/{userId}", getUser) {\n auto userId = req->getPathVariable("userId");\n auto user = userService->getUser(userId);\n \n // توثيق OpenAPI تلقائي\n auto dto = UserDto::createShared();\n dto->id = user->id;\n dto->name = user->name;\n return createDtoResponse(Status::CODE_200, dto);\n}\nيقوم Oat++ تلقائيًا بتوليد openapi.yaml بناءً على التعليقات التوضيحية. وهذا يسمح بعدم كتابة المواصفات يدويًا، بل استخلاصها من الكود.
3. Restbed + Swagger UI
\nRestbed هو إطار HTTP خفيف لـ C++11. بالاقتران مع مكتبة restbed-swagger، يمكن توليد توثيق OpenAPI ديناميكيًا.
\n#include <restbed>\n#include <restbed-swagger>\n\nauto resource = std::make_shared<restbed::Resource>();\nresource->set_path("/api/users/{id}");\n\n// وصف المعلمات لـ Swagger\nrestbed::swagger::Info info;\ninfo.set_title("User API");\ninfo.set_version("1.0.0");\n\nauto swagger = std::make_shared<restbed::swagger::Service>(info);\nswagger->publish(resource);\n\n4. Crow — إطار عمل مصغر مع امتداد OpenAPI
\nCrow —