GraphQL API مع C++: دليل تعليمي خطوة بخطوة للمبتدئين
GraphQL هي لغة استعلام حديثة لواجهات API، تتيح للعملاء طلب البيانات التي يحتاجونها فقط. على عكس REST، حيث تكون بنية الاستجابة ثابتة، يوفر GraphQL المرونة والتحكم. في هذا الدليل التعليمي، سنشرح كيفية إنشاء GraphQL API بسيط بلغة C++ من الصفر. ستتعلم كيفية ربط مكتبة graphql-cpp، تعريف المخطط، كتابة المحللات (Resolvers)، واختبار الاستعلامات. المقالة موجهة للمبتدئين الملمين بأساسيات C++.
لماذا C++؟ توفر هذه اللغة أداءً عاليًا، وهو أمر بالغ الأهمية لواجهات API ذات الأحمال العالية. يُستخدم GraphQL بلغة C++ غالبًا في أنظمة الوقت الفعلي، محركات الألعاب، وخدمات الويب عالية التحميل. لنبدأ!
تثبيت وإعداد البيئة
للعمل، نحتاج إلى مترجم يدعم C++17 (مثل GCC 8+ أو Clang 10+)، CMake، ومكتبة graphql-cpp. سنقوم بتثبيت كل ما هو ضروري.
الخطوة 1: تثبيت التبعيات
في Ubuntu/Debian، نفذ:
sudo apt updatesudo apt install build-essential cmake libboost-all-dev libssl-devبالنسبة لنظام macOS، استخدم Homebrew:
brew install cmake boost opensslالخطوة 2: استنساخ مكتبة graphql-cpp
مكتبة graphql-cpp هي تطبيق خفيف الوزن لـ GraphQL بلغة C++. استنسخ المستودع:
git clone https://github.com/your-repo/graphql-cpp.gitcd graphql-cppmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasemake -j4sudo make installبعد التثبيت، سننشئ مشروعًا جديدًا. هيكل المجلدات:
my_graphql_api/├── CMakeLists.txt├── src/│ ├── main.cpp│ └── schema.cpp└── include/ └── schema.hالخطوة 3: إعداد CMakeLists.txt
أنشئ ملف CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)project(GraphQLExample)
set(CMAKE_CXX_STANDARD 17)
find_package(graphql-cpp REQUIRED)find_package(Boost REQUIRED COMPONENTS system)
add_executable(graphql_example src/main.cpp src/schema.cpp)target_include_directories(graphql_example PRIVATE include)target_link_libraries(graphql_example graphql-cpp::graphql-cpp Boost::system)تعريف مخطط GraphQL
المخطط هو جوهر GraphQL API. يصف أنواع البيانات، الاستعلامات (queries) والتحويرات (mutations). في مثالنا، سننشئ API لإدارة قائمة الكتب.
إنشاء نوع Book
في ملف include/schema.h، سنعلن عن هيكل البيانات ودالة لإنشاء المخطط:
#ifndef SCHEMA_H#define SCHEMA_H
#include <graphql-cpp/graphql.hpp>#include <string>#include <vector>
struct Book { int id; std::string title; std::string author; int year;};
graphql::Schema createBookSchema();
#endif // SCHEMA_Hتنفيذ المخطط
في ملف src/schema.cpp، سنعرف الأنواع والاستعلام الجذري:
#include "schema.h"#include <graphql-cpp/graphql.hpp>#include <vector>#include <memory>
using namespace graphql;
// مخزن مؤقت للكتبstd::vector<Book> books = { {1, "C++ Primer", "Stanley B. Lippman", 2012}, {2, "Effective Modern C++", "Scott Meyers", 2014}};
Schema createBookSchema() { // 1. تعريف نوع Book ObjectType bookType("Book"); bookType.addField("id", Type::NonNull(Type::Int())); bookType.addField("title", Type::NonNull(Type::String())); bookType.addField("author", Type::NonNull(Type::String())); bookType.addField("year", Type::Int());
// 2. تعريف الاستعلام الجذري ObjectType queryType("Query"); queryType.addField("books", Type::List(Type::NonNull(bookType)), [](const auto& args) -> json { json result =