أساسيات GraphQL

مزايا استخدام GraphQL على واجهات برمجة تطبيقات REST

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

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

شرح موجز لكيفية عمل GraphQL

يحتوي تطبيق GraphQL بشكل أساسي على ثلاثة أجزاء

  • المخطط - يصف البيانات.
  • المحللات - منطق لجلب البيانات من موارد مختلفة (الخدمات المصغرة).
  • الاستعلام - يسأل العميل عن البيانات التي سيتم جلبها.

المخطط (المزيد حول المخطط والأنواع)

➡️
type Query{getUsers:[User]getUser(user_id:Int!):User}type Mutation{addUser(first_name:String!,last_name:String,pic:String):Boolean deleteUser(user_id:Int!):Boolean}type User{first_name:Stringlast_name:Stringpic:Stringfull_name:Stringuser_id:Int!designation:String}

يصف الرمز أعلاه ما يمكن الاستعلام عنه وبيانات الاستجابة (نوع البيانات) المتوقعة من الموارد.

ملاحظة: "!" يعني أن الحقل لا يمكن أن يكون فارغا أو غير محدد.

المحللات (الكود أدناه مكتوب في NodeJs)

➡️
{Query:{getUsers:(obj,args,context,info) => { return users},getUser:(obj,{user_id},context,info) => { return users.find(user => user.user_id == user_id) } },Mutation:{ addUser:(obj,{first_name,last_name,pic},context,info) => { users.push({ first_name:first_name, last_name:last_name, pic:pic }) return true },deleteUser:(obj,{user_id},context,info) => { for (var i = 0; i < users.length; i++) { if(users[i].user_id == user_id){ users.splice(i,1) return true }}return false } }, User:{ full_name:(prev_obj,args,context,info) => { return `${prev_obj.first_name} ${prev_obj.last_name}`}}}

يصف الرمز أعلاه المنطق الذي يتم تنفيذه عندما يطلب العميل.

ملاحظة لقد استخدمت وظيفة محلل full_name لنوع المستخدم لكتابة منطقتي الخاصة.

الاستعلام (المزيد حول الاستعلام)

➡️
{getUsers{full_name_pic}} {getUsers{full_name pic}}

استعلاماتالعميل باستخدام الكود أعلاه الذي يرجع فقط full_name والموافقة المسبقة عن علم على النحو التالي.

ملاحظة: يمكن للعميل الاستعلام فقط عن الحقول المحددة في المخطط.

➡️
{"data":{"getUsers":{"full_name":"Srinivasa Sainath", "pic":"https://vpms.xoxoday.com/images/xoxoday.png"}}}

يمكن أن يكون طلب العميل من الاستعلام والطفرة (والاشتراك. سيتم مناقشة هذا في المدونات المستقبلية لسلسلة GraphQL).

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

نقاط مهمة لفهم العلاقة بين وظائف المحلل والاستعلام

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

تتلقى دالة المحلل أربع وسيطات

إعراب:

➡️
{getUsers:(obj,args,context,info) =>{ return users }}
  • الكائنات الكائن السابق ، والذي غالبا ما لا يتم استخدامه لحقل على نوع استعلام الجذر.
    للفهم ، راجع المزيد حول هذه الوسيطة إلى خادم GraphQL مع Node.js.
  • أرجس الوسيطات المتوفرة للحقل في استعلام GraphQL. في وظيفة المحلل أعلاه {user_input} هي args
  • سياق قيمة يتم توفيرها لكل محلل وتحتفظ بمعلومات سياقية مهمة مثل المستخدم الذي قام بتسجيل الدخول حاليا ، أو الوصول إلى قاعدة بيانات. في المحلل أعلاه ، يتم استخدام سياق الوظيفة لتمرير token_info
  • معلومات قيمة تحتوي على معلومات خاصة بالحقل ذات صلة بالاستعلام الحالي بالإضافة إلى تفاصيل المخطط. في كثير من الأحيان لا تستخدم
➡️
استنساخ مشروع GraphQL التجريبي من هنا،ملاحظة: في الجزء التالي من سلسلة GraphQL، سأناقش كيفية تنفيذ GraphQL كبوابة لواجهة برمجة التطبيقات.