GraphQL API مع C++: دليل تعليمي خطوة بخطوة
GraphQL هي لغة استعلام لواجهات API، طورتها Facebook. على عكس REST، تتيح للعميل طلب البيانات التي يحتاجها فقط، مما يقلل من حجم المعلومات المنقولة ويسرّع أداء التطبيقات. في هذا الدليل التعليمي، سننشئ خادم GraphQL بسيطًا بلغة C++ باستخدام المكتبة graphql-cpp. ستتعلم كيفية تعريف المخطط (Schema)، وكتابة الدوال الحلالة (Resolvers)، ومعالجة الاستعلامات والتحويرات (Mutations).
ما هو GraphQL ولماذا C++؟
يوفر GraphQL نقطة نهاية موحدة لجميع الاستعلامات. المفاهيم الأساسية:
- المخطط (Schema) — وصف لأنواع البيانات والعمليات المتاحة (استعلامات، تحويرات، اشتراكات).
- الاستعلامات (Queries) — عمليات قراءة البيانات.
- التحويرات (Mutations) — عمليات كتابة/تعديل البيانات.
- الدوال الحلالة (Resolvers) — دوال تعيد البيانات لكل حقل.
C++ هي لغة قوية للأنظمة عالية التحميل. استخدام GraphQL مع C++ يتيح إنشاء واجهات 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;
// تعريف نوع Userauto userType = std::make_shared<ObjectType>( "User", { {"id", Type::NonNull(Type::ID)}, {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} });
// تعريف Queryauto queryType = std::make_shared<ObjectType>( "Query", { {"users", Type::List(Type::NonNull(userType))}, {"user", Type::NonNull(userType), {{"id", Type::NonNull(Type::ID)}}} });
// تعريف Mutationauto 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",
```