C++ के साथ GraphQL API: चरण-दर-चरण ट्यूटोरियल
GraphQL API के लिए एक शक्तिशाली क्वेरी भाषा है, जो क्लाइंट को केवल वही डेटा प्राप्त करने की अनुमति देती है जिसकी उन्हें आवश्यकता है, और कुछ भी अतिरिक्त नहीं। हालाँकि C++ वेब-API बनाने के लिए सबसे लोकप्रिय भाषा नहीं है, लेकिन इसका प्रदर्शन और मेमोरी पर नियंत्रण इसे उच्च-लोड सिस्टम के लिए एक उत्कृष्ट विकल्प बनाता है। इस ट्यूटोरियल में, हम graphql-cpp लाइब्रेरी का उपयोग करके C++ में एक कार्यशील GraphQL सर्वर बनाएंगे।
शुरुआत के लिए क्या आवश्यक है
काम करने के लिए आपको निम्नलिखित की आवश्यकता होगी:
- C++17 समर्थन वाला कंपाइलर (GCC 8+, Clang 7+, MSVC 2019+)
- CMake संस्करण 3.14 या उच्चतर
graphql-cppलाइब्रेरी (vcpkg के माध्यम से इंस्टॉलेशन या स्रोत से बिल्ड)- HTTP सर्वर के लिए
libmicrohttpdलाइब्रेरी
vcpkg के माध्यम से निर्भरताएँ स्थापित करें:
git clone https://github.com/microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh./vcpkg install graphql-cpp libmicrohttpdप्रोजेक्ट की मूल संरचना बनाना
CMake प्रोजेक्ट सेटअप से शुरू करें। CMakeLists.txt फ़ाइल बनाएँ:
cmake_minimum_required(VERSION 3.14)project(graphql-cpp-tutorial)
set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(graphql-cpp CONFIG REQUIRED)find_package(MHD CONFIG REQUIRED)
add_executable(graphql-server main.cpp)target_link_libraries(graphql-server graphql-cpp::graphql-cpp MHD::MHD)अब न्यूनतम सर्वर के साथ मुख्य फ़ाइल main.cpp बनाएँ:
#include <graphql-cpp/GraphQL.h>#include <microhttpd.h>#include <iostream>#include <string>
using namespace graphql::cpp;
// HTTP अनुरोधों को संभालने का फ़ंक्शनstatic enum MHD_Result request_handler(void* cls, struct MHD_Connection* connection, const char* url, const char* method, const char* version, const char* upload_data, size_t* upload_data_size, void** con_cls) { const char* response_str = "{\\"data\\":{\\"hello\\":\\"world\\"}}"; struct MHD_Response* response = MHD_create_response_from_buffer( strlen(response_str), (void*)response_str, MHD_RESPMEM_PERSISTENT ); MHD_add_response_header(response, "Content-Type", "application/json"); int ret = MHD_queue_response(connection, MHD_HTTP_OK, response); MHD_destroy_response(response); return ret == MHD_YES ? MHD_YES : MHD_NO;}
int main() { struct MHD_Daemon* daemon = MHD_start_daemon( MHD_USE_INTERNAL_POLLING_THREAD, 4000, NULL, NULL, &request_handler, NULL, MHD_OPTION_END ); if (daemon == NULL) { std::cerr << "Failed to start server" << std::endl; return 1; } std::cout << "Server running on http://localhost:4000/graphql" << std::endl; getchar(); MHD_stop_daemon(daemon); return 0;}GraphQL स्कीमा परिभाषित करना
अब एक वास्तविक GraphQL स्कीमा जोड़ें। Book प्रकार और रूट प्रकार Query बनाएँ:
#include <graphql-cpp/Schema.h>#include <graphql-cpp/Type.h>#include <vector>#include <memory>
using namespace graphql::cpp;
// डेटा मॉडलstruct Book { int id; std::string title; std::string author; int year;};
// पुस्तकों का रिपॉजिटरी (डेटाबेस का अनुकरण)class BookRepository {public: static std::vector<Book> getAll() { return { {1, "वॉर एंड पीस", "लियो टॉल्स्टॉय", 1869}, {2, "क्राइम एंड पनिशमेंट", "फ्योडोर दोस्तोयेव्स्की", 1866}, {3, "द मास्टर एंड मार्गारीटा", "मिखाइल बुल्गाकोव", 1967} }; } static Book getById(int id) { auto books = getAll(); for (const auto& book