C++ पर GraphQL: cppgraphqlgen — आधुनिक API के लिए शक्तिशाली उपकरण
GraphQL API के लिए एक क्वेरी भाषा है, जो क्लाइंट को केवल आवश्यक डेटा प्राप्त करने की अनुमति देती है। हालाँकि GraphQL को अक्सर JavaScript (Apollo, Relay) या Python (Graphene, Strawberry) से जोड़ा जाता है, उच्च-लोड C++ सिस्टम के लिए भी एक उत्कृष्ट समाधान है — cppgraphqlgen लाइब्रेरी। यह आधुनिक C++17/20 मानकों के समर्थन के साथ शुद्ध C++ पर GraphQL सर्वर-साइड बनाने के लिए उपकरणों का एक पूरा सेट प्रदान करती है।
cppgraphqlgen क्या है?
cppgraphqlgen एक header-only लाइब्रेरी है (वैकल्पिक रूप से .so/.dll में संकलन के साथ), जो GraphQL विनिर्देश (June 2018) को लागू करती है। यह स्कीमा (SDL — Schema Definition Language) के आधार पर टाइप-सेफ कोड उत्पन्न करती है और कुशल, मल्टी-थ्रेडेड GraphQL सर्वर बनाने की अनुमति देती है।
मुख्य विशेषताएँ:
- स्कीमा से कोड जनरेशन — आप
.graphqlफ़ाइल में प्रकार, क्वेरी और म्यूटेशन का वर्णन करते हैं, औरgraphqlgenउपयोगिता C++ क्लासेस बनाती है। - टाइप-सुरक्षा — सभी प्रकार संकलन चरण पर जाँचे जाते हैं। प्रकारों से कोई runtime-त्रुटियाँ नहीं।
- प्रदर्शन — न्यूनतम ओवरहेड, एसिंक्रोनस रिज़ॉल्वर के लिए समर्थन (
std::futureके माध्यम से)। - सब्सक्रिप्शन (Subscriptions) के लिए समर्थन — WebSocket या gRPC के माध्यम से।
- किसी भी HTTP सर्वर के साथ एकीकरण —
crow,drogon,beast(Boost.Asio) या अपने स्वयं के कार्यान्वयन के साथ उपयोग किया जा सकता है।
लाइब्रेरी की आर्किटेक्चर
cppgraphqlgen दो भागों से मिलकर बनी है:
- कोड जनरेटर (
graphqlgen) — स्कीमा पढ़ता है और प्रत्येक प्रकार के लिए क्लासेस, रिज़ॉल्वर के लिए इंटरफ़ेस और सहायक फ़ंक्शन के साथ हेडर फ़ाइलें बनाता है। - Runtime-लाइब्रेरी — क्वेरी पार्सर, वैलिडेटर, निष्पादक और प्रतिक्रिया सीरियलाइज़र।
स्थापना
लाइब्रेरी vcpkg के माध्यम से वितरित की जाती है या स्रोत से संकलित की जाती है:
git clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target installजनरेटर का उपयोग करने के लिए node.js की आवश्यकता होगी (यह TypeScript में लिखा गया है), लेकिन runtime शुद्ध C++ है।
उदाहरण: एक सरल GraphQL सर्वर बनाना
पहले एक स्कीमा schema.graphql बनाएँ:
type Query { hello: String user(id: Int!): User}
type User { id: Int name: String email: String}फिर जनरेटर चलाएँ:
graphqlgen --schema schema.graphql --output ./generatedइसके बाद generated फ़ोल्डर में फ़ाइलें दिखाई देंगी: SchemaTypes.h, SchemaResolver.h और अन्य। अब रिज़ॉल्वर लिखें:
#include "generated/SchemaTypes.h"#include "generated/SchemaResolver.h"
class QueryResolver : public graphql::schema::Query::Resolver {public: std::shared_ptr<graphql::schema::String> getHello() override { return std::make_shared<graphql::schema::String>("Hello, GraphQL from C++!"); }
std::shared_ptr<graphql::schema::User> getUser(int id) override { auto user = std::make_shared<graphql::schema::User>(); user->id = std::make_shared<graphql::schema::Int>(id); user->name = std::make_shared<graphql::schema::String>("John Doe"); user->email = std::make_shared<graphql::schema::String>("john@example.com"); return user; }};अब crow का उपयोग करके सर्वर बनाएँ:
#include <crow.h>#include "generated/Schema.h"