دليل المبتدئين لواجهات واتحادات GraphQL

ما هو GraphQL؟

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

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

قامت شركات رئيسية مثل GitHub وTwitter وIndeed وShopify بتبني GraphQL، مما يبرز إمكانياتها في تبسيط تطوير واجهات برمجة التطبيقات وتحسين تفاعل العميل مع الخادم.

واجهة GraphQL

في GraphQL، تعمل الواجهة بشكل مماثل للواجهات في البرمجة الشيئية. إنها نوع مجرد يحدد مجموعة من الحقول الشائعة التي يمكن لأنواع الكائنات المتعددة تنفيذها. يضمن هذا أن يمكن للعميل استعلام هذه الحقول الشائعة بثقة عبر أنواع مختلفة. 

Markdown

 

استعلام عميل GraphQL:

Markdown

 

في هذا المثال، الحقول المشتركة مثل id، name، و model متاحة عبر جميع أنواع الكائنات التي تنفذ واجهة Vehicle. ومع ذلك، يمكن الاستعلام عن الحقول الخاصة بنوع الكائن مثل fuelType لـ Car و gearCount و isElectric لـ Bicycle باستخدام شظايا.

إذا كان العميل بحاجة فقط إلى الحقول المشتركة، يمكنه تجاهل الشظايا:

Markdown

 

فوائد استخدام الواجهات

  1. إعادة استخدام الشيفرة: يمكن تعريف الحقول المشتركة في الواجهة ومشاركتها عبر أنواع متعددة، مما يقلل من التكرار.
  2. تبسيط منطق العميل على الجانب الخادم: العملاء لا يحتاجون إلى فحوصات شرطية لأنواع الكائنات. يمكنهم طلب الأنواع الدقيقة والتعامل بثقة مع الردود.
  3. قابلية توسيع النموذج: يصبح إضافة حقل مشترك جديد أسهل نظرًا لأنه يجب تعريفه فقط في الواجهة.
  4. هيكلية مفروضة: تفرض الواجهات هيكل مشترك عبر جميع أنواع التنفيذ، مما يضمن الاتساق (على سبيل المثال، يجب أن تحتوي جميع المركبات على id، name، و model).
  5. الاستعلام الموحد: بدلاً من الاستعلام عن أنواع مختلفة بشكل فردي، يمكن للعملاء الاستعلام عن واجهة واحدة لاسترداد البيانات من جميع أنواع التنفيذ.
  6. تحسين الوثائق: من خلال تحديد السلوك المشترك من خلال الواجهات، يصبح من الأسهل على مستهلكي واجهة برمجة التطبيقات فهم الأنواع ذات الصلة والعمل معها.

اتحاد GraphQL

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

Markdown

 

استعلام عميل GraphQL:

Markdown

 

في هذا المثال، المنتج، الخدمة، والاشتراك هي جميعها أنواع مميزة تنتمي إلى اتحاد PurchaseItem. يمكن للعميل استعلام جميع الأنواع الثلاثة باستخدام أجزاء في استعلام واحد، على الرغم من أنهم لا يشاركون في أي حقول.

ملاحظة مهمة حول الاتحادات: يجب أن تكون جميع الأنواع الأعضاء في نوع الاتحاد من أنواع الكائنات الأساسية؛ يجب ألا تكون الأنواع السلمية، الواجهة، وأنواع الاتحاد أعضاء في الاتحاد. وبالمثل، يجب ألا تكون أنواع التغليف أعضاء في الاتحاد.

فوائد استخدام الاتحادات

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

في الملخص

تقدم واجهات GraphQL والاتحادات طرقًا قوية لهيكلة مخطط GraphQL الخاص بك، مما يتيح المرونة ويبسّط تفاعلات العميل مع الخادم. تتيح الواجهات مشاركة الحقول عبر الأنواع، مما يعزز إعادة استخدام الكود ويسهل توسيع المخطط. من ناحية أخرى، تقدم الاتحادات طريقة لاستعلام أنواع متباينة معًا دون الحاجة إلى الحقول المشتركة.

Source:
https://dzone.com/articles/a-beginners-guide-to-graphql-interfaces-and-unions