GraphQL في C++: مكتبة cppgraphqlgen لإنشاء واجهات API

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

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

ابدأ الدورة

مكتبة 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 مع الكود المناسب. مثال على المعالجة:


                
    
    

توصيات