परिचय: क्यों GraphQL और C++ एक शक्तिशाली संयोजन है
GraphQL आधुनिक API के लिए एक मानक बन गया है, जो REST की तुलना में लचीलापन और दक्षता प्रदान करता है। लेकिन इसे C++ पर कैसे लागू करें - एक ऐसी भाषा जो अपने प्रदर्शन और कठोरता के लिए जानी जाती है? इस ट्यूटोरियल में, हम cppgraphqlgen लाइब्रेरी का उपयोग करके C++ में एक पूर्ण GraphQL API बनाने की प्रक्रिया को समझेंगे। आप सीखेंगे कि स्कीमा कैसे परिभाषित करें, रिज़ॉल्वर कैसे लिखें, क्वेरी और म्यूटेशन को कैसे संभालें। कोड उदाहरण व्यावहारिक होंगे ताकि आप उन्हें तुरंत अपनी परियोजनाओं में लागू कर सकें।
लेख के अंत तक, आप C++ में एक सरल लेकिन कार्यशील GraphQL सर्वर बनाने में सक्षम होंगे जो अनुरोध स्वीकार करता है और डेटा लौटाता है। चलिए शुरू करते हैं!
पर्यावरण की स्थापना और कॉन्फ़िगरेशन
काम करने के लिए हमें आवश्यकता होगी:
- C++17 समर्थन वाला कंपाइलर (जैसे, GCC 8+ या Clang 7+)
- CMake (संस्करण 3.14+)
cppgraphqlgenलाइब्रेरी (GraphQL स्कीमा से कोड जनरेशन)- HTTP सर्वर (सरलता के लिए, जैसे
cpp-httplib)
vcpkg के माध्यम से निर्भरताएँ स्थापित करें या मैन्युअल रूप से बनाएँ। इस ट्यूटोरियल के लिए, हम vcpkg का उपयोग करते हैं:
git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh./vcpkg install cppgraphqlgen cpp-httplibप्रोजेक्ट संरचना बनाएँ:
graphql-cpp-tutorial/├── schema.graphql├── CMakeLists.txt├── src/│ ├── main.cpp│ ├── resolver.cpp│ └── resolver.hचरण 1: GraphQL स्कीमा परिभाषित करें
कार्य प्रबंधन (Todo) के लिए एक सरल स्कीमा के साथ schema.graphql फ़ाइल बनाएँ:
type Query { todos: [Todo!]! todo(id: ID!): Todo}
type Mutation { addTodo(title: String!): Todo! completeTodo(id: ID!): Todo}
type Todo { id: ID! title: String! completed: Boolean!}यह स्कीमा वर्णन करती है:
- Query — कार्यों की सूची या ID द्वारा एक कार्य प्राप्त करना
- Mutation — नया कार्य जोड़ना और पूर्ण के रूप में चिह्नित करना
- Type Todo — id, title, completed फ़ील्ड वाला ऑब्जेक्ट
स्कीमा हमारे API का अनुबंध है। इसके बाद हम इससे C++ कोड जनरेट करेंगे।
चरण 2: स्कीमा से C++ कोड जनरेट करें
cppgraphqlgen पैकेज से graphqlgenerategen उपयोगिता का उपयोग करें:
graphqlgenerategen schema.graphql --output-dir ./generatedनिष्पादन के बाद, generated फ़ोल्डर में फ़ाइलें दिखाई देंगी:
TodoObject.h— Todo प्रकार के लिए क्लासQueryObject.h— Query रिज़ॉल्वर के लिए बेस क्लासMutationObject.h— Mutation रिज़ॉल्वर के लिए बेस क्लासschema.h— स्कीमा एकीकरण
इन फ़ाइलों में जनरेटेड इंटरफ़ेस होते हैं जिन्हें हमें लागू करना होता है।
चरण 3: रिज़ॉल्वर का कार्यान्वयन
घोषणाओं के साथ resolver.h फ़ाइल बनाएँ:
#include "generated/QueryObject.h"#include "generated/MutationObject.h"#include <vector>#include <memory>
struct Todo { std::string id; std::string title; bool completed;};
class QueryResolver : public graphql::todo::QueryObject {public: std::vector<std::shared_ptr<graphql::todo::TodoObject>> getTodos() const override; std::shared_ptr<graphql::todo::TodoObject> getTodo(const std::string& id) const override;
private: static std::vector<Todo> todos_;};
class MutationResolver : public graphql::todo::MutationObject {public: std::shared_ptr<graphql::todo::TodoObject> applyAddTodo(const std::string& title) override; std::shared_ptr<graphql::todo::TodoObject> applyCompleteTodo(const std::string& id) override;};अब resolver.cpp में तर्क लागू करें:
#include "