تصميم واجهات برمجة التطبيقات القابلة للتوسع بلغة جافا باستخدام GraphQL

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

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

ما هو GraphQL؟

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

مزايا نهج GraphQL:

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

ما هي واجهة برمجة التطبيقات REST؟

نقل الحالة التمثيلية (REST) هو نمط معماري لبناء واجهات برمجة تطبيقات. يستخدم أساليب HTTP القياسية مثل GET و POST و PUT و DELETE لأداء عمليات CRUD. يُعرف REST ببساطته وانتشاره الواسع.

قيود REST:

  • زيادة الاسترجاع أو نقصانه للبيانات.
  • يتطلب عدة نقاط نهاية وتقديم إصدارات لاستيعاب التغييرات.
  • لا توجد إمكانيات مدمجة للوقت الحقيقي.

GraphQL مقابل REST API: ما الفرق؟

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

الفروق الرئيسية

  • على عكس REST، الذي يستخدم عدة نقاط نهاية ويتطلب تقديم إصدارات للتغييرات، يجمع GraphQL عمليات استرجاع البيانات في استعلام واحد ويقلل من الحاجة للتقديم بما أن العملاء يحددون متطلبات البيانات. 
  • بينما يستخدم REST رموز حالة HTTP للإشارة إلى النجاح أو الأخطاء، يُرجع GraphQL دائمًا حالة 200 OK ويعلن عن الأخطاء في جسم الاستجابة. 
  • كما يدعم GraphQL التحديثات في الوقت الحقيقي من خلال الاشتراكات، على عكس REST الذي يفتقر إلى دعم مدمج للوقت الحقيقي.
  • على الرغم من أن REST قد أصبح متأصلًا بشكل واسع مع العديد من الأدوات، إلا أن بيئة GraphQL قد نمت بسرعة، مما يوفر أدوات قوية مثل GraphiQL لتطوير أسهل.
  • وأخيرًا، بينما يستخدم REST الهيدرات للتخزين المؤقت، يتطلب GraphQL تقنيات متقدمة أكثر بسبب الاستعلامات الديناميكية ولكنه يوفر خيارات مثل الاستعلامات المحفوظة للتخزين المؤثر.

مفاهيم GraphQL الأساسية

1. لغة تعريف النموذج (SDL)

GraphQL لديه نظام أنواعه الخاص الذي يُستخدم لتحديد نموذج API. يُسمى بالنحو الذي يتم كتابة النماذج به لغة تعريف النموذج (SDL).

2. الاستعلامات مقابل التعديلات مقابل الاشتراكات

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

3. نموذج GraphQL

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

4. محللو البيانات: ربط استعلامات GraphQL بالبيانات

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

فوائد استخدام GraphQL في جافا

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

إعداد واجهة برمجة تطبيقات GraphQL في جافا

مثال واقعي: المستخدمون والطلبات

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

1. إعداد المشروع

إنشاء مشروع جديد بتقنية Spring Boot باستخدام أدوات Spring أو الانتقال إلى بداية Spring. ثم، أضف هذه التبعيات إلى ملف pom.xml:

XML

 

2. إنشاء الكيانات الخاصة بك

إنشاء كيانات جافا (مثل User و Order) لتمثيل البيانات التي سيتم استعلامها أو تغييرها عبر GraphQL. على سبيل المثال:

Java

 

3. إنشاء مستودعات

إنشاء مستودعات للتفاعل مع قاعدة البيانات:

Java

 

4. إنشاء فئات الخدمة

إنشاء فئات خدمة للتعامل مع منطق الأعمال:

Java

 

5. إنشاء متحكمات GraphQL

تعريف متحكمات GraphQL للتعامل مع الاستعلامات والتحولات:

Java

 

6. تعريف مخطط GraphQL الخاص بك

إنشاء ملف schema.graphqls في دليل src/main/resources:

Plain Text

 

7. تكوين GraphQL في application.properties

اختياريًا، قم بتكوين إعدادات GraphQL في scr/main/resources/application.properties:

Properties files

 

8. تشغيل التطبيق الخاص بك

قم بتشغيل تطبيق SpringBoot باستخدام mvn spring-boot:run أو من بيئة التطوير الخاصة بك. بمجرد بدء التشغيل، يمكنك الوصول إلى نقطة نهاية GraphAL عند /graphiql.

9. اختبار بواسطة استعلامات GraphQL

قم بتجربة واجهة برمجة التطبيقات الخاصة بـ GraphQL باستخدام أداة مثل GraphiQL أو Postman.

لعملية التحول: 

Plain Text

 

الناتج:

Plain Text

 

للاستعلام:

Plain Text

 

الناتج:

JSON

 

ميزات GraphQL المتقدمة

1. تعزيز إعادة الاستخدام باستخدام Fragments

الـ Fragment هو عبارة عن مجموعة قابلة لإعادة الاستخدام من الحقول المحددة لنوع معين. إنه ميزة تساعد في تحسين هيكل وإعادة استخدام كود GraphQL الخاص بك.

2. تحليل الحقول بواسطة الوسائط

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

3. ترقيم الصفحات والترتيب باستخدام GraphQL

ترقيم الصفحات

ترقيم الصفحات هو موضوع معقد في تصميم واجهة برمجة التطبيقات. على مستوى عال ، هناك نهجان رئيسيان بخصوص كيفية التعامل معه.

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

الترتيب

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

التحديات والاعتبارات عند استخدام GraphQL

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

الاستنتاج

GraphQL يقدم نهجًا مرنًا وفعالًا لبناء واجهات برمجة تطبيقات حديثة في جافا، مما يجعله خيارًا مثاليًا لتطبيقات الديناميكية والبيانات الكثيفة. تبسيط تصميم الواجهة البرمجية وضمان الأداء القوي من خلال بنية النقطة الواحدة. سواء كنت تقوم بإنشاء دليل بسيط للموظفين أو منصة تحليلية معقدة، يمنح GraphQL المطورين القدرة على تقديم حلول قابلة للتوسع بسهولة. ابدأ استكشاف GraphQL اليوم مع أدوات مثل Spring Boot و graphql-java لاستكشاف كامل إمكاناته في مشروعك القادم.

كود المصدر

يمكنك العثور على الشفرة الكاملة لهذا البرنامج التعليمي على جيتهاب.

Source:
https://dzone.com/articles/design-scalable-java-apis-with-graphql