GraphQL API على C++: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

GraphQL API مع C++: دليل تعليمي خطوة بخطوة



GraphQL هي لغة استعلام قوية لواجهات برمجة التطبيقات (API) تتيح للعملاء الحصول على البيانات التي يحتاجونها بالضبط، دون أي شيء إضافي. على الرغم من أن لغة C++ ليست اللغة الأكثر شيوعًا لإنشاء واجهات برمجة تطبيقات الويب، إلا أن أداءها والتحكم في الذاكرة يجعلها خيارًا ممتازًا للأنظمة عالية التحميل. في هذا الدليل التعليمي، سنقوم بإنشاء خادم GraphQL عملي بلغة C++ باستخدام مكتبة graphql-cpp.



ما تحتاجه للبدء



للعمل، ستحتاج إلى:

  • مترجم يدعم C++17 (GCC 8+, Clang 7+, MSVC 2019+)
  • CMake الإصدار 3.14 أو أعلى
  • مكتبة graphql-cpp (التثبيت عبر vcpkg أو البناء من المصدر)
  • مكتبة libmicrohttpd لخادم HTTP


سنقوم بتثبيت التبعيات عبر 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;

// دالة معالجة طلبات HTTPstatic 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

المدونات

توصيات الكتب