GraphQL API सी ++ के साथ: चरण-दर-चरण ट्यूटोरियल
GraphQL एक क्वेरी भाषा है API के लिए, जिसे Facebook द्वारा विकसित किया गया है। REST के विपरीत, यह क्लाइंट को केवल उन्हीं डेटा का अनुरोध करने की अनुमति देता है जिनकी उसे आवश्यकता होती है, जिससे स्थानांतरित जानकारी की मात्रा कम हो जाती है और एप्लिकेशन का काम तेज़ हो जाता है। इस ट्यूटोरियल में, हम graphql-cpp लाइब्रेरी का उपयोग करके C++ में एक सरल GraphQL सर्वर बनाएंगे। आप सीखेंगे कि स्कीमा कैसे परिभाषित करें, रिज़ॉल्वर कैसे लिखें और क्वेरी और म्यूटेशन को कैसे संसाधित करें।
GraphQL क्या है और C++ क्यों?
GraphQL सभी क्वेरी के लिए एक एकल एंडपॉइंट प्रदान करता है। मुख्य अवधारणाएँ:
- स्कीमा (Schema) — उपलब्ध डेटा प्रकारों और संचालन (क्वेरी, म्यूटेशन, सब्सक्रिप्शन) का विवरण।
- क्वेरी (Queries) — डेटा पढ़ने के संचालन।
- म्यूटेशन (Mutations) — डेटा लिखने/बदलने के संचालन।
- रिज़ॉल्वर (Resolvers) — फ़ंक्शन जो प्रत्येक फ़ील्ड के लिए डेटा लौटाते हैं।
C++ उच्च-लोड सिस्टम के लिए एक शक्तिशाली भाषा है। C++ के साथ GraphQL का उपयोग करने से कुशल और स्केलेबल API बनाने में मदद मिलती है। graphql-cpp लाइब्रेरी एकीकरण के लिए एक सुविधाजनक इंटरफ़ेस प्रदान करती है।
प्रोजेक्ट की स्थापना और कॉन्फ़िगरेशन
काम करने के लिए हमें आवश्यकता होगी:
- C++17 कंपाइलर (उदाहरण के लिए, g++ या MSVC)।
graphql-cppलाइब्रेरी (vcpkg के माध्यम से स्थापना या स्रोत से बिल्ड)।- HTTP-सर्वर (हम सरलता के लिए
cpp-httplibका उपयोग करेंगे)।
vcpkg के माध्यम से स्थापना
vcpkg install graphql-cppvcpkg install cpp-httplibप्रोजेक्ट संरचना
फ़ाइलें बनाएँ:
main.cpp— एंट्री पॉइंट और HTTP-सर्वर।schema.hpp— GraphQL स्कीमा की परिभाषा।resolvers.hpp— रिज़ॉल्वर का कार्यान्वयन।CMakeLists.txt— बिल्ड कॉन्फ़िगरेशन।
GraphQL स्कीमा की परिभाषा
हम उपयोगकर्ताओं की सूची प्रबंधित करने के लिए एक सरल स्कीमा बनाएंगे। User प्रकार में id, name और email फ़ील्ड शामिल हैं। क्वेरी: users (सभी उपयोगकर्ताओं की सूची) और user(id: ID!) (एक उपयोगकर्ता)। म्यूटेशन: addUser(name: String!, email: String!): User।
schema.hpp फ़ाइल में:
#ifndef SCHEMA_HPP#define SCHEMA_HPP
#include <graphqlcpp/GraphQLSchema.h>
using namespace graphqlcpp;
// User प्रकार को परिभाषित करेंauto userType = std::make_shared<ObjectType>( "User", { {"id", Type::NonNull(Type::ID)}, {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} });
// Query को परिभाषित करेंauto queryType = std::make_shared<ObjectType>( "Query", { {"users", Type::List(Type::NonNull(userType))}, {"user", Type::NonNull(userType), {{"id", Type::NonNull(Type::ID)}}} });
// Mutation को परिभाषित करेंauto mutationType = std::make_shared<ObjectType>( "Mutation", { {"addUser", Type::NonNull(userType), { {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} }} });
// स्कीमा को इकट्ठा करेंauto schema = std::make_shared<Schema>(queryType, mutationType);
#endif // SCHEMA_HPPरिज़ॉल्वर का कार्यान्वयन
रिज़ॉल्वर ऐसे फ़ंक्शन हैं जो प्रत्येक फ़ील्ड के लिए डेटा लौटाते हैं। हमारे उदाहरण में, डेटा एक ग्लोबल वेक्टर में संग्रहीत किया जाएगा। resolvers.hpp फ़ाइल में:
#ifndef RESOLVERS_HPP#define RESOLVERS_HPP
#include <vector>#include <string>#include <graphqlcpp/Resolvers.h>
using namespace graphqlcpp;
struct User { std::string id; std::string name; std::string email;};
std::vector<User> users = { {"1", "
```