مكتبة GraphQL بلغة C++: تنفيذ API باستخدام graphql-cpp

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

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

ابدأ الدورة

مكتبة GraphQL للغة C++: graphql-cpp



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



ما هو graphql-cpp؟

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



الإمكانيات الرئيسية

  • دعم كامل لمخطط GraphQL: الكائنات، الواجهات، أنواع الاتحاد، التعداد، الأنواع العددية وأنواع الإدخال.
  • التحقق من الصحة وتنفيذ الاستعلامات: مدقق ومنفذ مدمجان مع دعم الاستعلامات المعقدة، الأجزاء والتوجيهات.
  • دعم الاشتراكات (Subscriptions): التنفيذ عبر التدفقات التفاعلية.
  • محللات قابلة للتخصيص: نظام مرن لربط منطق الأعمال بحقول المخطط.
  • التوافق مع C++17/20: استخدام إمكانيات اللغة الحديثة لتحقيق أقصى أداء.
  • عدم وجود تبعيات: لا يتطلب Boost أو POCO أو أي مكتبات خارجية أخرى.


التثبيت والتوصيل

المكتبة متاحة كملفات رأس فقط (header-only). للتثبيت، استنسخ المستودع:

git clone https://github.com/your-repo/graphql-cpp.gitcd graphql-cppmkdir build && cd buildcmake ..makesudo make install

في مشروعك، يكفي تضمين ملف رأس واحد:

#include <graphqlcpp/GraphQL.h>


مثال: إنشاء API بسيط

لننظر في إنشاء مخطط للحصول على معلومات المستخدمين.



1. تعريف المخطط

using namespace graphqlcpp;

auto schema = Schema::create(R"( type Query { user(id: ID!): User users: [User] } type User { id: ID! name: String! email: String })");


2. تنفيذ المحللات

// مثال لمخزن البياناتstd::map<std::string, User> users = {    {"1", {"1", "Alice", "alice@example.com"}},    {"2", {"2", "Bob", "bob@example.com"}}};

// محلل لحقل userschema->addResolver("Query", "user", [](const ResolverArgs& args) { auto id = args.getArgument<std::string>("id"); if (users.count(id)) return users[id]; return nullptr; // null إذا لم يتم العثور على المستخدم});

// محلل لحقل usersschema->addResolver("Query", "users", [](const ResolverArgs&) { std::vector<User> result; for (const auto& [_, user] : users) { result.push_back(user); } return result;});


3. معالجة الاستعلام

std::string query = R"(    {        user(id: "1") {            name            email        }    })";

auto result = schema->execute(query);std::cout << result.dump(2) << std::endl;

الإخراج:

{  "data": {    "user": {      "name": "Alice",      "email": "alice@example.com"    }  }}


المزايا للموقع التعليمي

  • توثيق واضح: المكتبة تحتوي على تعليقات مفصلة في الكود وأمثلة لكل نوع.
  • عتبة دخول منخفضة: للبدء، يكفي معرفة أساسيات C++ والمفاهيم الأساسية.

توصيات