GraphQL API على C++: دليل تعليمي خطوة بخطوة للمبتدئين

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

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

ابدأ الدورة

مقدمة: لماذا تعتبر GraphQL و C++ مزيجًا قويًا

أصبحت GraphQL معيارًا لواجهات برمجة التطبيقات الحديثة، حيث توفر مرونة وكفاءة مقارنة بـ REST. ولكن كيف يمكن تنفيذها في C++ - وهي لغة معروفة بأدائها العالي ودقتها؟ في هذا البرنامج التعليمي، سنقوم بإنشاء واجهة برمجة تطبيقات GraphQL كاملة باستخدام C++ ومكتبة cppgraphqlgen. ستتعلم كيفية تعريف المخطط (schema)، وكتابة المحللات (resolvers)، ومعالجة الاستعلامات والتحويرات (mutations). ستكون أمثلة الكود عملية بحيث يمكنك تطبيقها فورًا في مشاريعك.

بنهاية المقال، ستتمكن من إنشاء خادم GraphQL بسيط لكنه عملي بلغة C++، يستقبل الاستعلامات ويعيد البيانات. فلنبدأ!



تثبيت وإعداد البيئة

لبدء العمل، نحتاج إلى:

  • مترجم يدعم C++17 (مثل GCC 8+ أو Clang 7+)
  • CMake (الإصدار 3.14+)
  • مكتبة cppgraphqlgen (لتوليد الكود من مخطط GraphQL)
  • خادم HTTP (مثل cpp-httplib للبساطة)

سنقوم بتثبيت التبعيات عبر vcpkg أو بناؤها يدويًا. في هذا البرنامج التعليمي، سنستخدم vcpkg:

git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh./vcpkg install cppgraphqlgen cpp-httplib

لننشئ هيكل المشروع:

graphql-cpp-tutorial/├── schema.graphql├── CMakeLists.txt├── src/│   ├── main.cpp│   ├── resolver.cpp│   └── resolver.h


الخطوة 1: تعريف مخطط GraphQL

لننشئ ملف schema.graphql بمخطط بسيط لإدارة المهام (Todo):

type Query {    todos: [Todo!]!    todo(id: ID!): Todo}

type Mutation { addTodo(title: String!): Todo! completeTodo(id: ID!): Todo}

type Todo { id: ID! title: String! completed: Boolean!}

يصف هذا المخطط:

  • Query — جلب قائمة المهام أو مهمة واحدة بواسطة المعرف
  • Mutation — إضافة مهمة جديدة ووضع علامة كمكتملة
  • Type Todo — كائن يحتوي على الحقول id, title, completed

المخطط هو عقد واجهة برمجة التطبيقات الخاصة بنا. بعد ذلك، سنقوم بتوليد كود C++ منه.



الخطوة 2: توليد كود C++ من المخطط

نستخدم الأداة graphqlgenerategen من حزمة cppgraphqlgen:

graphqlgenerategen schema.graphql --output-dir ./generated

بعد التنفيذ، ستظهر الملفات في مجلد generated:

  • TodoObject.h — فئة لنوع Todo
  • QueryObject.h — الفئة الأساسية لمحللات Query
  • MutationObject.h — الفئة الأساسية لمحللات Mutation
  • schema.h — دمج المخطط

تحتوي هذه الملفات على واجهات مولدة يجب علينا تنفيذها.



الخطوة 3: تنفيذ المحللات (Resolvers)

لننشئ ملف resolver.h مع التصريحات:

#include "generated/QueryObject.h"#include "generated/MutationObject.h"#include <vector>#include <memory>

struct Todo { std::string id; std::string title; bool completed;};

class QueryResolver : public graphql::todo::QueryObject {public: std::vector<std::shared_ptr<graphql::todo::TodoObject>> getTodos() const override; std::shared_ptr<graphql::todo::TodoObject> getTodo(const std::string& id) const override;

private: static std::vector<Todo> todos_;};

class MutationResolver : public graphql::todo::MutationObject {public: std::shared_ptr<graphql::todo::TodoObject> applyAddTodo(const std::string& title) override; std::shared_ptr<graphql::todo::TodoObject> applyCompleteTodo(const std::string& id) override;};

الآن سنقوم بتنفيذ المنطق في resolver.cpp:

#include                

المدونات

توصيات الكتب