GraphQL في C++: مكتبة cppgraphqlgen لواجهات API الحديثة

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

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

ابدأ الدورة

GraphQL على C++: cppgraphqlgen — أداة قوية لواجهات API الحديثة



GraphQL هي لغة استعلام لواجهات API تتيح للعملاء الحصول على البيانات المطلوبة فقط. على الرغم من أن GraphQL غالبًا ما يرتبط بـ JavaScript (Apollo، Relay) أو Python (Graphene، Strawberry)، إلا أن هناك حلاً ممتازًا للأنظمة عالية التحميل بلغة C++ — وهو مكتبة cppgraphqlgen. توفر مجموعة كاملة من الأدوات لإنشاء الجزء الخادم من GraphQL بلغة C++ نقية مع دعم المعايير الحديثة C++17/20.



ما هو cppgraphqlgen؟



cppgraphqlgen هي مكتبة header-only (مع إمكانية التجميع الاختياري إلى .so/.dll) تنفذ مواصفات GraphQL (يونيو 2018). تقوم بتوليد كود آمن من حيث الأنواع بناءً على المخطط (SDL — Schema Definition Language) وتتيح إنشاء خوادم GraphQL فعالة ومتعددة الخيوط.



الميزات الرئيسية:

  • توليد الكود من المخطط — تصف الأنواع والاستعلامات والتحويرات في ملف .graphql، وتقوم أداة graphqlgen بإنشاء فئات C++.
  • أمان الأنواع — يتم التحقق من جميع الأنواع في مرحلة التجميع. لا توجد أخطاء في وقت التشغيل تتعلق بالأنواع.
  • الأداء — تكاليف إضافية ضئيلة، دعم المحللين غير المتزامنين (عبر std::future).
  • دعم الاشتراكات (Subscriptions) — عبر WebSocket أو gRPC.
  • التكامل مع أي خادم HTTP — يمكن استخدامه مع crow، drogon، beast (Boost.Asio) أو حتى التنفيذ الخاص بك.


بنية المكتبة



يتكون cppgraphqlgen من جزأين:

  1. مولد الكود (graphqlgen) — يقرأ المخطط وينشئ ملفات رأسية تحتوي على فئات لكل نوع، وواجهات للمحللين، ووظائف مساعدة.
  2. مكتبة وقت التشغيل — محلل الاستعلامات، المدقق، المنفذ، ومُسلسِل الردود.


التثبيت

يتم توزيع المكتبة عبر vcpkg أو تُبنى من المصدر:

git clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target install


لاستخدام المولد، ستحتاج إلى node.js (مكتوب بلغة TypeScript)، لكن وقت التشغيل هو C++ نقي.



مثال: إنشاء خادم GraphQL بسيط



أولاً، قم بإنشاء المخطط schema.graphql:

type Query {    hello: String    user(id: Int!): User}

type User { id: Int name: String email: String}


ثم قم بتشغيل المولد:

graphqlgen --schema schema.graphql --output ./generated


بعد ذلك، ستظهر في المجلد generated ملفات: SchemaTypes.h، SchemaResolver.h وغيرها. الآن اكتب المحللين:



#include "generated/SchemaTypes.h"#include "generated/SchemaResolver.h"

class QueryResolver : public graphql::schema::Query::Resolver {public: std::shared_ptr<graphql::schema::String> getHello() override { return std::make_shared<graphql::schema::String>("Hello, GraphQL from C++!"); }

std::shared_ptr<graphql::schema::User> getUser(int id) override { auto user = std::make_shared<graphql::schema::User>(); user->id = std::make_shared<graphql::schema::Int>(id); user->name = std::make_shared<graphql::schema::String>("John Doe"); user->email = std::make_shared<graphql::schema::String>("john@example.com"); return user; }};


الآن قم ببناء الخادم باستخدام crow:



#include <crow.h>#include "generated/Schema.h"

توصيات