ما الفرق بين GraphQL وREST؟

GraphQL وREST هما طريقتان مختلفتان لتصميم واجهات برمجة التطبيقات من أجل تبادل البيانات على شبكة الإنترنت. يمكّن REST تطبيقات العميل من تبادل البيانات مع خادم باستخدام أفعال HTTP، وهو بروتوكول الاتصال القياسي للإنترنت. أمّا GraphQL، فهي لغة استعلام لواجهات برمجة التطبيقات تُحدّد مواصفات طريقة طلب تطبيق العميل للبيانات من خادم بعيد. يمكنك استخدام GraphQL في مكالمات واجهة برمجة التطبيقات لديك من دون الاعتماد على التطبيق من جانب الخادم لتحديد الطلب. تعد كلّ من GraphQL وREST التقنيّتَين القويّتَين وراء معظم تطبيقاتنا الحديثة.

اقرأ عن REST »

اقرأ عن تطبيق لغة GraphQL »

ما أوجه التشابه بين GraphQL وREST؟

تُعد GraphQL وREST كلتيهما نمطين شائعين من أنماط بنية واجهات برمجة التطبيقات (API) التي تتيح تبادل البيانات بين الخدمات أو التطبيقات المختلفة في نموذج العميل-الخادم.

تُسهِّل واجهات برمجة التطبيقات الوصول إلى البيانات وعمليات البيانات كما يلي:

  1. يرسل أحد العملاء طلب واجهة برمجة تطبيقات إلى نقطة نهاية واحدة أو نقاط نهاية متعددة على أحد الخوادم
  2. يقدم الخادم استجابة تحتوي على بيانات أو حالة بيانات أو رموز الأخطاء

يسمح كل من REST وGraphQL بإنشاء البيانات وتعديلها وتحديثها وحذفها على تطبيق أو خدمة أو وحدة منفصلة عبر واجهة برمجة التطبيقات (API). تُعرف واجهات برمجة التطبيقات التي طُوِّرت باستخدام REST باسم واجهات RESTful API أو واجهات REST API. أما واجهات برمجة التطبيقات التي طُوِّرت باستخدام GraphQL فهي ببساطة واجهات GraphQL API.

تستخدم فرق الواجهة الأمامية والخلفية بنيات واجهات برمجة التطبيقات هذه لإنشاء تطبيقات نموذجية يسهل الوصول إليها. يساعد استخدام بنية واجهة برمجة التطبيقات في الحفاظ على الأنظمة آمنة ونموذجية وقابلة للتوسع. وهي تجعل الأنظمة أيضًا أفضل أداءً وأسهل في التكامل مع الأنظمة الأخرى.

نناقش بعد ذلك بعض أوجه التشابه الأخرى بين GraphQL وREST.

القراءة عن واجهات برمجة التطبيقات (API) »

البنية

ينفذ كل من REST وGraphQL العديد من المبادئ البنيوية لواجهات برمجة التطبيقات المشتركة. على سبيل المثال، يرد فيما يلي المبادئ التي يتشاركان فيها:

  • كلاهما بلا حالة، لذلك لا يحفظ الخادم سجل الاستجابات بين الطلبات
  • يستخدم كليهما نموذج العميل-الخادم، لذلك تؤدي الطلبات الواردة من عميل واحد إلى ردود من خادم واحد
  • يستند كلاهما إلى HTTP، نظرًا إلى أن HTTP هو بروتوكول الاتصال الأساسي

تصميم قائم على الموارد

يصمم REST وGraphQL كلاهما عملية تبادل البيانات الخاصة بهما حول الموارد. يشير المورد إلى أي بيانات أو كائن يمكن للعميل الوصول إليه ومعالجته من خلال واجهة برمجة التطبيقات. لدى كل مورد معرِّف فريد خاص به (URI) ومجموعة من العمليات (أساليب HTTP) التي يمكن للعميل تنفيذها عليه.

على سبيل المثال، فكر في واجهة برمجة تطبيقات لوسائل التواصل الاجتماعي التي من خلالها ينشئ المستخدمون المنشورات ويديرونها. في واجهة برمجة التطبيقات القائمة على الموارد، يُعد المنشور موردًا. لديه معرِّف فريد خاص به، على سبيل المثال، /posts/1234. ولديه مجموعة من العمليات، مثل GET لاسترداد المنشور في REST أو query لاسترداد المنشور في GraphQL.

تبادل البيانات

يدعم REST وGraphQL تنسيقات بيانات مماثلة.

JSON هو تنسيق تبادل البيانات الأكثر شيوعًا الذي تفهمه جميع اللغات والمنصات والأنظمة. يرجع الخادم بيانات بتنسيق JSON إلى العميل. تتوفر تنسيقات بيانات أخرى ولكنها أقل شيوعًا من حيث الاستخدام، ومنها XML وHTML.

وبالمثل، يدعم كل من REST وGraphQL التخزين المؤقت. لذلك، يمكن للعملاء والخوادم تخزين البيانات التي يُجرى الوصول إليها بشكل متكرر مؤقتًا لزيادة سرعة الاتصال.

اقرأ حول JSON »

حيادية اللغة وقاعدة البيانات

تعمل كل من واجهتي برمجة التطبيقات GraphQL وREST مع أي هيكلية قاعدة بيانات وأي لغة برمجة، من جانب العميل ومن جانب الخادم على حدٍّ سواء. وهذا يجعلها قابلة للتشغيل المتبادل بشكل كبير مع أي تطبيق.

ما قيود REST التي تحاول GraphQL التغلب عليها؟

ظهرت GraphQL في عام 2012 كاستجابة للحاجة إلى السرعة في منصات وسائل التوصل الاجتماعي الناشئة. وجد المطورون أن بُنى واجهة برمجة التطبيقات (API) الحالية، مثل REST، كانت منظمة وطويلة للغاية لإنتاج موجزات الأخبار بكفاءة.

وفيما يلي، نناقش بعض التحديات التي واجهوها.

تبادل البيانات ذات الهيكلية الثابتة

تتطلب REST API طلبات العميل لاتباع هيكلية ثابتة لتلقي المورد. هذه الهيكلية الراسخة سهلة الاستخدام، ولكنها ليست دائمًا الوسيلة الأكثر فعالية لتبادل البيانات المطلوبة بالضبط.

الإفراط في الإحضار وقلة الإحضار

ترجع واجهات REST API دائمًا مجموعة بيانات كاملة. على سبيل المثال، من كائن شخص في REST API، ستتلقى اسم الشخص وتاريخ ميلاده وعنوانه ورقم هاتفه. ستحصل على جميع هذه البيانات حتى لو كنت بحاجة إلى رقم هاتف فقط.

وبالمثل، إذا كنت تريد معرفة رقم هاتف شخص ما وآخر عملية شراء، فستحتاج إلى طلبات REST API عديدة. سيعرض URL /person رقم الهاتف وسيعرض URL /purchase سجل الشراء.

كان على مطوري وسائل التواصل الاجتماعي كتابة الكثير من التعليمات البرمجية لا لشيء إلا لمعالجة طلبات واجهة برمجة التطبيقات (API)، ما أثر في الأداء وتجربة المستخدم.

ظهرت GraphQL كحل قائم على الاستعلام. يمكن أن ترجع الاستعلامات البيانات الدقيقة في طلب واحد فحسب لواجهة برمجة تطبيقات (API) وتبادل الاستجابة.

الاختلافات الرئيسة: GraphQL مقابل REST

REST API هي مفهوم بنيوي للاتصال بالتطبيق. على الجانب الآخر، GraphQL عبارة عن مواصفات ولغة استعلام لواجهة برمجة التطبيقات (API) ومجموعة من الأدوات. تعمل GraphQL على نقطة نهاية واحدة باستخدام بروتوكول نقل النص التشعبي (HTTP).

بالإضافة إلى ذلك، كان تركيز تطوير REST بشكل أكبر على إنشاء واجهات برمجة تطبيقات (API) جديدة. وفي الوقت نفسه، كان تركيز GraphQL على أداء واجهة برمجة التطبيقات (API) ومرونتها.

وفيما بعد سنقدم بعض الاختلافات.

الطلب من جانب العميل

إليك ما يستخدمه طلب REST ليعمل بشكل صحيح: 

  • أفعال بروتوكول نقل النص التشعبي (HTTP) التي تحدد الإجراء
  • عنوان URL الذي يحدد المورد الذي سيُنفَّذ فعل بروتوكول نقل النص التشعبي (HTTP) عليه
  • المعلَمات والقيم المراد تحليلها، إذا كنت ترغب في إنشاء كائن أو تعديله داخل مورد من جانب الخادم قائم

على سبيل المثال، يمكنك استخدام GET للحصول على البيانات للقراءة فقط من مورد ما، أو POST لإضافة إدخال مورد جديد، أو PUT لتحديث مورد ما.

في المقابل، إليك ما تستخدمه طلبات GraphQL:

  • استعلام للحصول على بيانات القراءة فقط
  • التبديل لتعديل البيانات
  • الاشتراك لتلقي تحديثات البيانات المستندة إلى الأحداث أو المتدفقة

يصف تنسيق البيانات كيف تريد أن يرجع الخادم البيانات، ويدخل في ذلك الكائنات والحقول التي تطابق المخطط من جانب الخادم. يمكنك أيضًا إدخال بيانات جديدة. داخليًا، ترسل GraphQL كل طلب عميل كطلب POST لبروتوكول نقل النص التشعبي (HTTP).

البيانات المرجعة إلى العميل

ضمن بنية REST، يجري إرجاع البيانات إلى العميل من الخادم في بنية الموارد بأكملها المحددة بواسطة الخادم. تعرض الأمثلة الآتية البيانات المرجعة في REST وGraphQL.

مثال على البيانات المرجعة في REST

في REST، ترجع GET /posts ما يلي:

[

  {

    "id": 1,

    "title": "First Post",

    "content": "This is the content of the first post."

  },

  {

    "id": 2,

    "title": "Second Post",

    "content": "This is the content of the second post."

  },

  {

    "id": 3,

    "title": "Third Post",

    "content": "This is the content of the third post."

  }

]

مثال على البيانات المُرجعة في GraphQL

عندما تستخدم GraphQL، يجري إرجاع البيانات المحددة فقط في الهيكلية التي قدمها العميل.

GET /graphql?query{post(id: 1) {id title content}} returns only the first post:

{

  "data": {

    "posts": [

      {

        "id": "1",

        "title": "First Post",

        "content": "This is the content of the first post."

      },

]}}

المخطط من جانب الخادم

تستخدم GraphQL مخططًا من جانب الخادم لتعريف البيانات وخدمات البيانات التي تختلف عن REST API.

يتضمن المخطط، المكتوب بلغة تعريف مخطط GraphQL، تفاصيل مثلما يرد أدناه:

  • أنواع الكائنات والحقول التي تنتمي إلى كل كائن
  • وظائف المحلل من جانب الخادم التي تحدد عملية لكل حقل

يحدد المخطط بشكل صريح الأنواع لوصف جميع البيانات المتوفرة على النظام وكيف يمكن للعملاء الوصول إلى تلك البيانات أو تعديلها. 

على الجانب الآخر، لا تتطلب واجهات REST API مخططًا من جانب الخادم. ولكن يمكنك تحديده اختياريًا لتصميم واجهة برمجة التطبيقات (API) الفعّال والتوثيق وتطوير العميل. 

التقسيم إلى إصدارات

مع تطور واجهات برمجة التطبيقات (API)، قد تتغير هيكليات البيانات والعمليات الخاصة بها. بالنسبة للعملاء الذين لا يعرفون هذه التغييرات، فإنها يمكن أن تؤدي إلى فشل أنظمتهم أو إحداث أخطاء غير معروفة.

غالبًا ما تتضمن واجهات REST API إصدارات في عنوان URL لحل هذه المشكلة، مثل https://example.com/api/v1/person/12341. ومع ذلك، فإن الإصدارات ليست إلزامية، ويمكن أن تؤدي إلى أخطاء. 

تتطلب GraphQL التوافق مع الإصدارات السابقة من واجهة برمجة التطبيقات (API). لذلك تعرض الحقول المحذوفة رسالة خطأ، أو تعرض الحقول ذات علامة مهملة (deprecated) تحذيرًا.

معالجة الأخطاء

GraphQL عبارة عن بنية واجهة برمجة تطبيقات (API) محددة النوع بدقة، ما يعني أنها تتطلب وصفًا تفصيليًا للبيانات وبنيتها وعمليات البيانات في المخطط. نظرًا إلى مستوى التفاصيل في المخطط، يمكن أن يحدد النظام أخطاء الطلب تلقائيًا ويقدم رسائل خطأ مفيدة. 

يجري تحديد واجهات REST API بشكل غير دقيق، ويجب أن تنشئ معالجة الأخطاء في التعليمات البرمجية المحيطة. على سبيل المثال، إذا حلل طلب PUT قيمة رقمية كنص بدلاً من كونها عددًا صحيحًا، فإن النظام لا يحدد الخطأ تلقائيًا.

متى تستخدم GraphQL مقابل REST

يمكنك استخدام GraphQL API وREST API بالتبادل. ومع ذلك، فهناك بعض حالات الاستخدام التي تكون فيها إحداهما مناسبة بشكل أفضل.

على سبيل المثال، من المحتمل أن تكون GraphQL خيارًا أفضل إذا كانت لديك هذه الاعتبارات:

  • لديك عرض نطاق محدود، وتريد تقليل عدد الطلبات والاستجابات لأدنى حد
  • لديك مصادر بيانات متعددة، وتريد دمجها في نقطة نهاية واحدة
  • لديك طلبات عملاء تختلف بشكل كبير، وتتوقع استجابات مختلفة للغاية

 

على الجانب الآخر، من المحتمل أن يكون REST خيارًا أفضل إذا كانت لديك هذه الاعتبارات:

  • لديك تطبيقات أصغر ببيانات أقل تعقيدًا
  • لديك بيانات وعمليات يستخدمها جميع العملاء بالطريقة نفسها
  • ليست لديك متطلبات للاستعلام عن البيانات المعقدة

 

من الممكن أيضًا إنشاء تطبيق واحد باستخدام واجهات GraphQL API وواجهات REST API لمجالات مختلفة من الوظائف.

كيفية استخدام كل من GraphQL وREST على واجهة برمجة التطبيقات (API) نفسها

يمكن ترقية REST API إلى GraphQL API بدون إجراء إعادة كتابة كاملة.

فيما يلي مخطط للعملية:

  1. افهم نموذج بيانات RESTful API. لفعل ذلك، افحص شكل البيانات في كل مورد من موارد URL.
  2. اكتب مخطط GraphQL من نموذج البيانات.
  3. حدِّد العمليات التي يجريها العملاء على البيانات وأدرجها في المخطط.
  4. أنشئ وظيفة محلل في التعليمات البرمجية من جانب الخادم لكل حقل في المخطط.
  5. أنشئ خادم GraphQL باستخدام المحللات والمخطط.

بعد ذلك، يمكن أن يتواصل العملاء مع واجهة برمجة تطبيقاتك (API) باستخدام GraphQL أو REST.

القراءة حول كيفية إنشاء محللات GraphQL »

ملخص الاختلافات بين REST وGraphQL

 

REST

GraphQL

ما التعريف؟

بروتوكول REST هو مجموعة من القواعد التي تحدد تبادل البيانات المهيكلة بين العميل والخادم.

لغة GraphQL هي لغة استعلام ونمط بنيوي ومجموعة من الأدوات اللازمة لإنشاء واجهات برمجة التطبيقات (API) ومعالجتها.

الاستخدام الأنسب

يناسب بروتوكول REST مصادر البيانات البسيطة حيث يتم تحديد الموارد جيدًا.

تناسب لغة GraphQL مصادر البيانات الكبيرة والمعقدة والمترابطة.

الوصول إلى البيانات

يتضمن بروتوكول REST نقاط نهاية متعددة في شكل عناوين URL لتحديد الموارد.

تتضمن لغة GraphQL نقطة نهاية واحدة لعنوان URL.

البيانات التي تم استرجاعها

يتولى بروتوكول REST إرجاع البيانات في هيكلية ثابتة يحددها الخادم.

تتولى لغة GraphQL إرجاع البيانات في هيكلية مرنة يحددها العميل.

طريقة هيكلة البيانات وتحديدها

تُكتسب بيانات REST بشكل ضعيف؛ لذا يجب على العميل تحديد طريقة تفسير البيانات المنسقة عند إرجاعها.

تُكتب بيانات GraphQL بشكل قوي؛ لذا يتلقى العميل البيانات بتنسيقات محددة مسبقًا ومفهومة بشكل متبادل.

التحقق من الأخطاء

عند استخدام بروتوكول REST، يجب على العميل التحقق مما إذا كانت البيانات الراجعة صالحة أم لا.

عند استخدام لغة GraphQL، يرفض عادةً هيكل المخطط الطلبات غير الصالحة؛ ما يؤدي إلى عرض رسالة خطأ منشأة تلقائيًا.

كيف تدعم AWS متطلبات GraphQL وREST؟

تساعدك Amazon Web Services (AWS) في إنشاء واجهات برمجة تطبيقات (API) مُدارة وتقديمها بشكل أفضل.

تُنشئ AWS AppSync واجهة برمجة تطبيقات GraphQL وواجهة برمجة تطبيقات النشر/الاشتراك (pub/sub) بلا خادم. وهي تُيسّر تطوير التطبيقات من خلال نقطة نهاية أحادية للاستعلام عن البيانات أو تحديثها أو نشرها بشكل آمن.

باستخدام AWS AppSync، يمكنك إنشاء واجهات برمجة تطبيقات تتيح للعملاء إجراء ما يلي:

  • التفاعل مع مصادر بيانات متعددة مثل SQL، وNoSQL، وبيانات البحث، ونقاط نهاية REST، والخدمات المصغرة من خلال استدعاء شبكة واحد
  • مزامنة البيانات تلقائيًا بين تطبيقات الهاتف الجوال والويب، والسحابة
  • بث البيانات من الواجهة الخلفية إلى العملاء المتصلين وفيما بينهم
  • الوصول إلى بيانات إنترنت الأشياء (IoT) لإنشاء لوحات معلومات في الوقت الفعلي في تطبيق الهاتف الجوال أو الويب

على نحوٍ مماثل، بوابة Amazon API عبارة عن خدمة مُدارة بالكامل تتيح لك سهولة إنشاء واجهات برمجة التطبيقات ونشرها وصيانتها ومراقبتها وتأمينها في أي نطاق.

نقدم فيما يلي بعض الطرق التي يمكنك من خلالها الاستفادة من استخدام بوابة API:

  • تزويد المستخدمين بأداء عالي السرعة لكل من طلبات واجهة برمجة التطبيقات (API) واستجاباتها
  • تفويض الوصول إلى واجهات برمجة التطبيقات
  • تشغيل العديد من الإصدارات لواجهة برمجة التطبيقات نفسها في وقتٍ واحد لتكرار الإصدارات الجديدة واختبارها وطرحها بسرعة
  • مراقبة مقاييس الأداء والمعلومات المتعلقة باستدعاءات واجهة برمجة التطبيقات، وزمن استجابة البيانات، ومعدلات الأخطاء

ابدأ استخدام GraphQL وREST على AWS من خلال إنشاء حساب اليوم.

الخطوات التالية مع AWS

ابدأ التطوير باستخدام GraphQL

تعرَّف على كيفية بدء استخدام GraphQL على AWS

تعرَّف على المزيد 
ابدأ التطوير باستخدام REST

تعرَّف على كيفية بدء استخدام REST على AWS

تعرَّف على المزيد