C++ के लिए Swagger/OpenAPI जनरेशन: REST API को ऑटोमेट कैसे करें
C++ में आधुनिक वेब डेवलपमेंट के लिए REST API बनाने हेतु कुशल टूल्स की आवश्यकता है। OpenAPI स्पेसिफिकेशन (पहले Swagger) वेब सर्विसेज के इंटरफेस को डिस्क्राइब करने का मानक बन गया है। लेकिन OpenAPI स्पेसिफिकेशन से C++ कोड का ऑटोमैटिक जनरेशन एक चुनौतीपूर्ण काम है। इस आर्टिकल में हम सबसे अच्छी लाइब्रेरी और टूल्स पर चर्चा करेंगे जो OpenAPI डॉक्यूमेंट्स से C++ में सर्वर और क्लाइंट कोड जेनरेट करने में आपकी मदद करेंगे।
C++ OpenAPI जनरेशन में दूसरी भाषाओं से पीछे क्यों है?
Python, Java या JavaScript के विपरीत, जहां पके हुए जेनरेटर मौजूद हैं (जैसे openapi-generator), C++ को कई समस्याओं का सामना करना पड़ता है:
- HTTP फ्रेमवर्क का एक मानक न होना — C++ में Flask या Spring जैसा कोई प्रमुख वेब फ्रेमवर्क नहीं है।
- मेमोरी मैनेजमेंट की जटिलता — स्मार्ट पॉइंटर्स के साथ सुरक्षित कोड जेनरेट करने के लिए अतिरिक्त पैटर्न की आवश्यकता होती है।
- डेटा टाइप्स की विविधता — C++ में JSON सीरियलाइजेशन के लिए जटिल स्ट्रक्चर्स की मैन्युअल सेटिंग जरूरी है।
OpenAPI से C++ कोड जेनरेट करने के मुख्य टूल्स
1. OpenAPI Generator (आधिकारिक जेनरेटर)
सबसे लोकप्रिय टूल OpenAPI Generator (पहले Swagger Codegen) है। यह C++ सहित कई भाषाओं को सपोर्ट करता है। हालांकि, C++ के लिए इसका सपोर्ट सीमित है: यह केवल cpprestsdk (Casablanca) या Qt पर आधारित क्लाइंट कोड जेनरेट करता है।
इंस्टॉलेशन:
# npm के जरिए
npm install @openapitools/openapi-generator-cli -g
# C++ क्लाइंट जनरेशन (cpprestsdk)
openapi-generator generate -i petstore.yaml -g cpp-restsdk -o ./client
जेनरेटेड कोड का उदाहरण (Qt):
// PetApi.h
class PetApi : public AbstractOpenAPISchema {
Q_OBJECT
public:
explicit PetApi(QObject *parent = nullptr);
void addPet(const Pet &body);
void getPetById(qint64 petId);
signals:
void addPetSignal(Pet &result);
void getPetByIdSignal(Pet &result);
};
फायदे: कई फॉर्मेट का सपोर्ट, सक्रिय कम्युनिटी।
नुकसान: जेनरेटेड कोड में अक्सर सुधार की जरूरत होती है; C++ के लिए सर्वर जनरेशन उपलब्ध नहीं है।
2. oat++ (oatpp) — OpenAPI सपोर्ट वाला फ्रेमवर्क
oat++ एक आधुनिक C++ फ्रेमवर्क है जो REST API बनाने के लिए है और इसमें OpenAPI का बिल्ट-इन सपोर्ट शामिल है। जेनरेटर्स के विपरीत, oat++ एनोटेशन के साथ डिक्लेरेटिव अप्रोच का उपयोग करता है।
एंडपॉइंट डिस्क्रिप्शन का उदाहरण:
ENDPOINT("GET", "/users/{userId}", getUser) {
auto userId = req->getPathVariable("userId");
auto user = userService->getUser(userId);
// ऑटोमैटिक OpenAPI डॉक्यूमेंटेशन
auto dto = UserDto::createShared();
dto->id = user->id;
dto->name = user->name;
return createDtoResponse(Status::CODE_200, dto);
}
Oat++ एनोटेशन के आधार पर ऑटोमैटिक रूप से openapi.yaml जेनरेट करता है। इससे स्पेसिफिकेशन मैन्युअल लिखने की बजाय कोड से ही प्राप्त हो जाती है।
3. Restbed + Swagger UI
Restbed C++11 के लिए एक हल्का HTTP फ्रेमवर्क है। restbed-swagger लाइब्रेरी के साथ मिलकर यह डायनामिक रूप से OpenAPI डॉक्यूमेंटेशन जेनरेट कर सकता है।
#include <restbed>
#include <restbed-swagger>
auto resource = std::make_shared<restbed::Resource>();
resource->set_path("/api/users/{id}");
// Swagger के लिए पैरामीटर डिस्क्रिप्शन
restbed::swagger::Info info;
info.set_title("User API");
info.set_version("1.0.0");
auto swagger = std::make_shared<restbed::swagger::Service>(info);
swagger->publish(resource);
4. Crow — OpenAPI एक्सटेंशन वाला माइक्रोफ्रेमवर्क
Crow C++ के सबसे तेज़ HTTP फ्रेमवर्क में से एक है। इसका एक फोर्क मौजूद है जो OpenAPI सपोर्ट प्रदान करता है।