مكتبة GraphQL للغة C++: cppgraphqlgen
cppgraphqlgen هي مكتبة حديثة بلغة C++ لتنفيذ الجزء الخادم من GraphQL. تتيح للمطورين إنشاء واجهات API آمنة من حيث الأنواع (Type-safe) وسريعة وقابلة للتوسع، باستخدام مزايا الكتابة الثابتة (Static Typing) في C++. تقوم المكتبة بتوليد الكود بناءً على مخطط GraphQL (ملفات .graphql)، مما يقلل من كتابة المحللات يدويًا ويقلل من احتمالية الأخطاء.
الميزات الرئيسية
- توليد الكود من المخطط — يتم إدخال ملف schema.graphql، ويتم إخراج فئات ودوال C++.
- أمان الأنواع — جميع أنواع GraphQL (String, Int, Float, Boolean, ID, Enum, Input, Object) تُترجم إلى أنواع C++ المقابلة.
- دعم الاشتراكات (Subscriptions) — يتم تنفيذها عبر WebSocket والتيارات غير المتزامنة.
- التحقق من صحة الاستعلامات — فحص مدمج لبناء الجملة ودلالات استعلامات GraphQL.
- التكامل مع HTTP — يعمل فوق أي خادم HTTP بلغة C++ (مثل
beastمن Boost). - دعم التوجيهات (Directives) — توجيهات مخصصة لتوسيع الوظائف.
التثبيت
لتثبيت cppgraphqlgen، يلزم وجود مترجم يدعم C++17 ونظام بناء CMake. التثبيت عبر vcpkg أو البناء من المصدر:
# عبر vcpkgvcpkg install cppgraphqlgen
# البناء من المستودعgit clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target installمثال على الاستخدام
لنأخذ مثالًا بسيطًا: سننشئ مخطط GraphQL للحصول على معلومات عن مستخدم وكتاب. أولاً، نحدد المخطط schema.graphql:
type Query { user(id: ID!): User book(id: ID!): Book}
type User { id: ID! name: String! email: String}
type Book { id: ID! title: String! author: String!}بعد توليد الكود (بأمر graphqlgen)، نحصل على الملف Generated.h. الآن نكتب المحللات بلغة C++:
#include "Generated.h"#include <unordered_map>
// بيانات مثال (في مشروع حقيقي — قاعدة بيانات)std::unordered_map<std::string, User> users = { {"1", {"1", "Alice", "alice@example.com"}}, {"2", {"2", "Bob", nullptr}}};
std::unordered_map<std::string, Book> books = { {"10", {"10", "C++ Primer", "Lippman"}}, {"20", {"20", "Effective Modern C++", "Meyers"}}};
// محلل لـ Query.userUser resolveGetUser(const std::string& id) { auto it = users.find(id); if (it != users.end()) { return it->second; } throw std::runtime_error("User not found");}
// محلل لـ Query.bookBook resolveGetBook(const std::string& id) { auto it = books.find(id); if (it != books.end()) { return it->second; } throw std::runtime_error("Book not found");}الآن نقوم بإعداد الخادم وتشغيل معالجة الاستعلامات:
#include <graphqlservice/GraphQLService.h>#include <beast/http.hpp>
int main() { // إنشاء خدمة بالمخطط auto service = std::make_shared<graphql::service::GraphQLService>();
// تسجيل المحللات service->addResolver("Query", "user", resolveGetUser); service->addResolver("Query", "book", resolveGetBook);
// تشغيل خادم HTTP (بشكل مبسط) http::server server("0.0.0.0", 8080, service); server.run();
return 0;}معالجة الأخطاء والتحقق من الصحة
تقوم المكتبة تلقائيًا بالتحقق من صحة الاستعلامات الواردة. إذا ألقى المحلل استثناءً، يقوم cppgraphqlgen بتحويله إلى خطأ GraphQL مع الكود المناسب. مثال على المعالجة:
أيضاً في المكتبة
توصيات