مكتبة 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++ والمفاهيم الأساسية.