كيف تسجل الدخول إلى التطبيقات باستخدام حسابك على Google أو Apple أو Microsoft؟ كيف تعمل المدفوعات عبر الإنترنت باستخدام Paystack أو PayPal؟ كيف تشارك التطبيقات مثل Facebook وInstagram المعلومات والإشعارات؟

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

تتيح واجهات برمجة التطبيقات التواصل بين التطبيقات، مما يسهل تبادل البيانات والتحقق منها.

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

إليك ما سنغطيه:

هذه المقالة مناسبة تمامًا للمبتدئين في تطوير الويب والجوال والمطورين الذين يسعون إلى فهم موجز لواجهات البرمجة التطبيقية (APIs) وكيفية عملها.

ما هي واجهة برمجة التطبيق (API)؟

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

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

كيف تعمل واجهات برمجة التطبيق (APIs)؟

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

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

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

لماذا تعد واجهات برمجة التطبيق (APIs) مهمة؟

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

بالنسبة للمستخدمين، تعزز واجهات برمجة التطبيق (APIs) أيضًا الأمان وتجربة المستخدم. تعمل كبوابات آمنة تقوم بتصفية تبادل البيانات بين التطبيقات والخدمات الخارجية، محمية المعلومات الحساسة وضمان التفاعلات السلسة والموثوقة.

أنواع واجهات برمجة التطبيق (APIs)

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

  1. واجهات برمجة التطبيق (APIs) المفتوحة (العامة)

  2. واجهات برمجة التطبيق (APIs) للشركاء

  3. واجهات برمجة التطبيق (APIs) الداخلية (الخاصة)

  4. واجهات برمجة التطبيق (APIs) المركبة

واجهات برمجة التطبيق (APIs) المفتوحة (العامة)

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

بعض واجهات برمجة التطبيقات المفتوحة المفيدة جداً تشمل:

  • TradeWatch – بيانات السوق المالية في الوقت الحقيقي

  • SearchApi – واجهة برمجة التطبيقات لنتائج بحث جوجل في الوقت الحقيقي

  • TwitterApi.io – الوصول إلى البيانات في الوقت الحقيقي والتاريخية

  • مولد منشورات إنستغرام – إنشاء منشورات باستخدام قوالب من صفحات إنستغرام الشهيرة

واجهات برمجة التطبيقات الشريكة

واجهات برمجة التطبيقات الشريكة تُشارك مع شركاء تجاريين محددين وغالباً ما تتطلب المصادقة والاتفاقيات. تقوم بأداء وظائف أساسية للأعمال والتطبيقات.

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

واجهات برمجة التطبيقات الداخلية

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

مثال على ذلك هو واجهة برمجة التطبيقات الداخلية لشركة تربط أنظمة الموارد البشرية والرواتب وإدارة المشاريع.

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

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

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

أنواع معمارية واجهة برمجة التطبيقات

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

  1. REST

  2. SOAP

  3. GraphQL

  4. gRPC

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

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

تم بناء واجهات برمجة التطبيق REST باستخدام الأطر Express.js (Node.js) ، Django/Flask (Python) ، و Spring Boot (Java).

مكونات رئيسية

  1. الموارد والنقاط النهائية:

    • يمكن أن تتضمن الكيانات التي يتم عرضها بواسطة واجهة برمجة التطبيق أي شيء: المستخدمون ، المنتجات ، المستندات ، إلخ.

    • يتم تحديد كل مورد بواسطة معرف URI فريد (Uniform Resource Identifier).

  1. أساليب HTTP:

    • GET: استرداد مورد.

    • POST: إنشاء مورد جديد.

    • PUT: تحديث مورد موجود.

    • DELETE: إزالة مورد.

    • PATCH: تحديث جزئي لمورد موجود.

  1. تمثيل البيانات:

    • يمكن أن يكون للمصادر تمثيلات متعددة (على سبيل المثال، JSON، XML).

    • تستجيب واجهة برمجة التطبيقات (API) بالتمثيل المطلوب، مما يسمح بترتيب البيانات وتحليلها بسهولة.

  1. رؤوس HTTP ومعلمات الاستعلام:

    • توفر رؤوس HTTP معلومات إضافية حول الطلب أو الاستجابة.

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

  1. عدم الحالة:

    • يجب أن تحتوي كل طلب من عميل إلى خادم على جميع المعلومات اللازمة لفهم ومعالجة الطلب.

    • الخادم لا يخزن أي حالة للعميل بين الطلبات.

تشمل المكونات البارزة الأخرى القابلية للتخزين، حالة HTTP، وHATEOAS. معًا، تحدد هذه المكونات بنية وسلوك أنظمة RESTful، مما يمكّن التواصل السلس والفعال بين العملاء والخوادم.

نظرة عامة على العمليات

تقوم واجهات برمجة تطبيقات REST بفتح الموارد من خلال URIs الفريدة وتسمح للعملاء بتنفيذ العمليات باستخدام طرق HTTP مثل GET، POST، PUT، DELETE، وPATCH. يمكن للعملاء طلب البيانات بتنسيقات متنوعة، مثل JSON أو XML، وإضافة تفاصيل إضافية من خلال رؤوس HTTP ومعلمات الاستعلام.

كل طلب غير مرتبط بالحالة ويحتوي على جميع المعلومات المطلوبة للمعالجة دون الاعتماد على بيانات العميل المخزنة. كما تستخدم واجهة برمجة التطبيقات رموز حالة HTTP، والقابلية للتخزين، وHATEOAS لإدارة الردود وتوجيه التفاعلات المستقبلية، مما يضمن إطار عمل تواصل سلس وفعال بين العملاء والخوادم.

مثال عملي وحالات استخدام في العالم الحقيقي

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

تتبع هذه واجهة برمجة التطبيقات مبادئ REST عن طريق استخدام أساليب HTTP القياسية لتنفيذ عمليات CRUD (إنشاء ، قراءة ، تحديث ، حذف):

const express = require("express"); const bodyParser = require("body-parser");
const app = express(); app.use(bodyParser.json());

const app = express();
app.use(bodyParser.json());

// قاعدة بيانات وهمية
let books = [
  { id: 1, title: "The Pragmatic Programmer", author: "Andy Hunt" },
  { id: 2, title: "Clean Code", author: "Robert C. Martin" },
];

// الحصول على جميع الكتب (العميل يطلب ، الخادم يستجيب)
app.get("/books", (req, res) => res.json(books));

// الحصول على كتاب واحد بواسطة الهوية
app.get("/books/:id", (req, res) => {
  const book = books.find((b) => b.id === parseInt(req.params.id));
  book ? res.json(book) : res.status(404).json({ message: "Not found" });
});

// نشر كتاب جديد (العميل يرسل البيانات ، الخادم يحدث قاعدة البيانات)
app.post("/books", (req, res) => {
  const newBook = { id: books.length + 1, ...req.body };
  books.push(newBook);
  res.status(201).json(newBook);
});

// تحديث الكتاب
app.put("/books/:id", (req, res) => {
  const book = books.find((b) => b.id === parseInt(req.params.id));
  if (book) {
    Object.assign(book, req.body);
    res.json(book);
  } else {
    res.status(404).json({ message: "Not found" });
  }
});

// حذف كتاب
app.delete("/books/:id", (req, res) => {
  const index = books.findIndex((b) => b.id === parseInt(req.params.id));
  if (index !== -1) {
    books.splice(index, 1);
    res.json({ message: "Deleted" });
  } else {
    res.status(404).json({ message: "Not found" });
  }
});

app.listen(3000, () => console.log("API running on port 3000"));

هنا ما يحدث في هذا الشفرة:

  • العميل يرسل طلبًا: يقوم المستخدم (أو تطبيق الواجهة الأمامية) بطلب البيانات باستخدام أساليب HTTP مثل GET ، POST ، PUT ، أو DELETE. على سبيل المثال: يطلب GET /books جميع الكتب أو يرسل POST /books كتابًا جديدًا إلى قاعدة البيانات.

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

  • يرسل الخادم استجابة: يقوم الخادم بإرسال استجابة JSON تحتوي على البيانات المطلوبة أو رسالة تأكيد. إليك مثال:

[
  { "id": 1, "title": "The Pragmatic Programmer", "author": "Andy Hunt" },
  { "id": 2, "title": "Clean Code", "author": "Robert C. Martin" }
]
  • يتلقى العميل البيانات ويستخدمها: يستهلك الواجهة الأمامية أو خدمة أخرى استجابة API ويعرضها أو يعالجها وفقًا لذلك.

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

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

بروتوكول الوصول البسيط للكائنات (SOAP) يستخدم XML للرسائل ويتضمن معايير مدمجة للأمان، والمعاملات، ومعالجة الأخطاء. يتم تعريف عقده الرسمي بواسطة WSDL (لغة وصف خدمات الويب).

تُعطي هذه البنية الأولوية للأمان والموثوقية من خلال ميزات مثل WS-Security وإدارة المعاملات، مما يجعلها مناسبة لتطبيقات المؤسسات المعقدة التي تتطلب معايير صارمة ومعالجة أخطاء قوية.

تُنشأ واجهات برمجة التطبيقات SOAP باستخدام أطر عمل أو أدوات مثل Apache CXF و .NET WCF و JAX-WS (Java).

المكونات الرئيسية

  1. غلاف SOAP:

    • هذا هو العنصر الجذري لرسالة SOAP ويحدد الهيكل العام لوثيقة XML.

    • يحتوي على رأس SOAP وجسم SOAP.

  1. جسم SOAP:

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

    • يشمل رسائل الطلب أو الاستجابة، التي تكون عادةً مُهيكلة كعناصر XML.

  1. لغة وصف خدمات الويب (WSDL):

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

    • تعمل كعقد بين العميل والخادم، تحدد كيفية التفاعل مع واجهة برمجة التطبيقات (API).

  1. معالج SOAP:

    • هذا هو المكون البرمجي الذي يعالج رسائل SOAP.

    • يحلل وثيقة XML، ويستخرج البيانات ذات الصلة، وينفذ العملية المطلوبة.

هناك أيضًا نقطة نهاية SOAP، وهي عنوان URL حيث يمكن الوصول إلى خدمة SOAP، ومخطط XML (XSD)، الذي يحدد الهيكل وأنواع البيانات المستخدمة في XML لرسالة SOAP.

نظرة عامة على العملية

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

يقوم معالج SOAP بعد ذلك بتحليل XML، واستخراج البيانات ذات الصلة، وتنفيذ العمليات المطلوبة وفقًا لقواعد محددة بواسطة مخطط XML (XSD) مرافق. يحدث التواصل مع الخدمة من خلال نقطة نهاية SOAP محددة، مما يضمن إطارًا موحدًا وقابلاً للتبادل للتفاعلات مع خدمة الويب.

أمثلة عملية وحالات استخدام في الحياة الواقعية

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

كيف يعمل:

  • استرداد معلومات الحساب: يرسل العميل طلبًا XML لاسترداد تفاصيل حساب مستخدم:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:bank="http://example.com/bank">
   <soapenv:Header/>
   <soapenv:Body>
      <bank:GetAccountDetails>
         <bank:AccountNumber>123456789</bank:AccountNumber>
      </bank:GetAccountDetails>
   </soapenv:Body>
</soapenv:Envelope>

الخادم يستجيب برسالة XML تحتوي على تفاصيل الحساب:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <GetAccountDetailsResponse>
         <AccountNumber>123456789</AccountNumber>
         <Balance>5000.00</Balance>
         <Currency>USD</Currency>
      </GetAccountDetailsResponse>
   </soapenv:Body>
</soapenv:Envelope>
  • قم بمعالجة تحويل مالي: يقدم العميل طلبًا للتحويل مع تفاصيل المصادقة:

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                        xmlns:bank="http://example.com/bank">
         <soapenv:Header/>
         <soapenv:Body>
            <bank:TransferFunds>
               <bank:FromAccount>123456789</bank:FromAccount>
               <bank:ToAccount>987654321</bank:ToAccount>
               <bank:Amount>100.00</bank:Amount>
               <bank:Currency>USD</bank:Currency>
            </bank:TransferFunds>
         </soapenv:Body>
      </soapenv:Envelope>
    

    إذا نجحت العملية، يرد الخادم برد تأكيد:

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
         <soapenv:Body>
            <TransferFundsResponse>
               <Status>Success</Status>
               <TransactionID>TXN987654</TransactionID>
            </TransferFundsResponse>
         </soapenv:Body>
      </soapenv:Envelope>
    

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

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

GraphQL هي لغة استعلام ووقت تشغيل لواجهات برمجة التطبيقات تم تطويرها بواسطة فيسبوك. تتيح للعملاء طلب البيانات التي يحتاجونها بالضبط في طلب واحد، مما يقلل من استرجاع البيانات الزائد وغير الكافي.

المكونات الرئيسية

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

Operation Overview

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

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

Examples and Real-world Use Cases

دعونا نستكشف كيفية عمل واجهات برمجة التطبيقات الخاصة بـ GraphQL عمليًا من خلال النظر في واجهة برمجة التطبيقات الخاصة بالتجارة الإلكترونية التي تعتمد على GraphQL. يمكن لهذه الواجهة البرمجية استرجاع تفاصيل المنتجات والمراجعات وتوافر المخزون بكفاءة. يتم إنشاء الخادم باستخدام NodeJS و Apollo Server. إنشاء الخادم خارج نطاق هذه المقالة، لذا سنركز على النموذج (كيفية تنظيم قاعدة بيانات ذات علاقات وتمثيلها بصورة بصرية) ومنطق الطلب والاستجابة.

  1. Schema:
# النظام البياني (schema.graphql)

type Product {
  id: ID!
  name: String!
  description: String
  price: Float!
  inventory: Int!
  category: String!
}

type Query {
  product(id: ID!): Product
  products(category: String): [Product!]!
}

type Mutation {
  createProduct(name: String!, description: String, price: Float!, inventory: Int!, category: String!): Product!
  updateProductInventory(id: ID!, inventory: Int!): Product!
}

يحدد النظام البياني أنواع البيانات (منتج, استعلام, تحويل) ويحدد الاستعلامات المتاحة (منتج, منتجات) والتحويلات (إنشاءمنتج, تحديثجردالمنتج). يستخدم نظام نوع GraphQL (سلسلة, عدد صحيح, عدد عشري, معرف, [ ], !)

  1. الطلبات والاستجابات

    • استرجاع بيانات المنتج – يقوم العميل بطلب حقول محددة للمنتج (على سبيل المثال، الاسم، السعر، والوصف):

        استعلام {
          المنتج(id: "123") {
            الاسم
            السعر
            الوصف
          }
        }
      

      إذا كانت ناجحة، يستجيب الخادم فقط بالبيانات المطلوبة:

        {
          "البيانات": {
            "المنتج": {
              "الاسم": "سماعات رأس لاسلكية",
              "السعر": 99.99,
              "متوفر": true
            }
          }
        }
      
    • إنشاء منتج جديد:

        تعديل {
          إنشاءمنتج(الاسم: "فأرة", السعر: 30, المخزون: 100, الفئة: "إلكترونيات") {
            id
            الاسم
            السعر
          }
        }
      
    • تحديث معلومات المنتج:

        تعديل {
          تحديثالمنتج(id: "123", السعر: 89.99) {
            الاسم
            السعر
          }
        }
      

      إذا كانت ناجحة، يعيد الخادم التفاصيل المحدثة:

        {
          "البيانات": {
            "تحديثالمنتج": {
              "الاسم": "سماعات رأس لاسلكية",
              "السعر": 89.99
            }
          }
        }
      

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

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

هي إطار عمل لاستدعاء الإجراءات عن بعد (gRPC) عالي الأداء يقوم بتسلسل البيانات المنظمة باستخدام HTTP/2 وبروتوكول بفرز. يدعم الاتصال المتزامن والغير متزامن وميزات مثل التدفق.

HTTP/2 هو تطور أحدث لبروتوكول نقل النص الفائق (HTTP)، مصمم بميزات مثيرة مثل الترميز الثنائي، التضاعف، ضغط الرأس ودفع الخادم لتعزيز الأداء وتقليل التأخير. يستفيد gRPC بالكامل من هذه القدرات، مما يتيح التواصل السريع والفعال والمتزامن، مما يجعله مناسبًا بشكل مثالي لخدمات الميكروسيرفيس والتطبيقات الفعلية.

المكونات الرئيسية

  1. تعريف الخدمة: يتم تعريفها في ملف .proto. يحدد الخدمات المقدمة وطرق استدعاء الإجراءات المتاحة، وهو عقد بين العميل والخادم.

  2. الرسائل هي هياكل بيانات معرفة باستخدام بروتوكول بفرز، الذي يقوم بتسلسل وفك تسلسل البيانات بين الأنظمة بكفاءة.

  3. التجازؤات: رمز العميل والخادم المولد تلقائيًا الذي يتيح للعميل استدعاء الطرق البعيدة كما لو كانت محلية ويمكّن الخادم من تنفيذ منطق الخدمة.

  4. القنوات: تدير هذه القنوات الاتصال بين العميل والخادم، وتتعامل مع التواصل الشبكي الأساسي.

  5. طرق الاتصال بروتوكول المسودة العامة: يدعم gRPC أنواعًا مختلفة من الاستدعاءات، بما في ذلك الاستدعاء الأحادي (طلب واحد واستجابة واحدة) والتدفق العميل والتدفق الخادم والتدفق ثنائي الاتجاه، وكل نوع يناسب حالات الاستخدام المختلفة.

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

نظرة عامة على العملية

يمكّن gRPC المطورين من تعريف عقود الخدمة وأنواع الرسائل في ملف .proto باستخدام Protocol Buffers، والذي يعمل كنموذج أساسي لطرق RPC المتاحة. ينتج مولّد الرموز نصوص العميل والخادم، مما يسمح بتنفيذ الإجراءات عن بُعد كما لو كانت وظائف محلية، بينما تدير القنوات التواصل الشبكي بناءً على HTTP/2.

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

أمثلة عملية وحالات استخدام في العالم الحقيقي

لنأخذ تطبيق مشاركة الرحلات كمثال يستخدم gRPC للتواصل السريع بين العملاء (تطبيقات الهاتف المحمول) وخدمات الخلفية. يستخدم gRPC التسلسل الثنائي عبر تنسيق Protocol Buffers (Protobuf) بدلاً من تنسيقات النصوص مثل JSON أو XML. هذا يجعل التواصل الشبكي أسرع بشكل كبير وأكثر كفاءة.

  1. يحدد ملف .proto هيكل الواجهة البرمجية:
syntax = "proto3";

service RideService {
  rpc RequestRide(RideRequest) returns (RideResponse);
  rpc StreamRideUpdates(RideUpdateRequest) returns (stream RideUpdate);
}

message RideRequest {
  string user_id = 1;
  string pickup_location = 2;
  string destination = 3;
}

message RideResponse {
  string ride_id = 1;
  string driver_name = 2;
  string car_model = 3;
}

message RideUpdate {
  string ride_id = 1;
  string status = 2;
  string driver_location = 3;
}

message RideUpdateRequest {
  string ride_id = 1;
}

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

  1. الطلب والاستجابة:

    • طلب رحلة: يقوم العميل بإرسال طلب رحلة عند الضغط على زر يتضمن:

        {
          "user_id": "U123",
          "pickup_location": "Central Park",
          "destination": "Times Square"
        }
      

      يستجيب الخادم بتفاصيل السائق:

        {
          "ride_id": "R456",
          "driver_name": "جون دو",
          "car_model": "تويوتا بريوس"
        }
      

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

        08 D2 04 12 0D 43 65 6E 74 72 61 6C 20 50 61 72 6B 1A 0B 54 69 6D 65 73 20 53 71 75 61 72 65
      
    • تحديثات الرحلة المتدفقة: بمجرد تعيين رحلة، يقوم الخادم ببث تحديثات في الوقت الحقيقي إلى العميل:

        {
          "ride_id": "R456",
          "status": "السائق في الطريق",
          "driver_location": "الشارع الخامس"
        }
      

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

كيفية اختيار بنية واجهة برمجة التطبيقات

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

تُعرف REST ببساطتها وتصميمها غير المتمثل، مما يساعد على التوسيع وسهولة الاستخدام، لكن أمانها يعتمد بشكل رئيسي على إجراءات خارجية مثل HTTPS وآليات المصادقة السليمة.

على الرغم من أن SOAP أكثر تعقيدًا، إلا أنها توفر معايير أمان قوية مضمنة (مثل WS-Security) ودعمًا موثوقًا للمعاملات، مما يجعلها مناسبة لبيئات المؤسسات.

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

يوفر gRPC أداء استثنائي وهو مثالي لخدمات ميكروسيرفس بحاجة إلى بيانات في الوقت الحقيقي. يستفيد من HTTP/2 وTLS للتواصل الآمن والفعال، على الرغم من أنه يتطلب منحنى تعلم أكثر انحدارًا.

الجدول أدناه يلخص الميزات والتنازلات بين هذه البنى:

الميزة REST SOAP GraphQL gRPC
الأداء معتدل (احتمال زيادة البيانات) منخفض عالي عالي
قدرة التوسع عالية معتدلة عالية مرتفعة جدًا (فعالة للخدمات الصغيرة والبيانات الحية)
سهولة الاستخدام بسيطة ومعتمد عليها على نطاق واسع معقدة بديهية للعملاء (قد تزداد تعقيدات الخادم) منحنى تعلم شديد
الأمان يعتمد على آليات خارجية (HTTPS، OAuth، وغيرها) أمان مدمج قوي عبر WS-Security وعقود رسمية يتطلب تدابير إضافية (التحقق من الاستعلامات، تحديد معدل الحد) أمان عالي مع دعم TLS المدمج وبروتوكولات مصادقة قوية

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

فهم البنى المعمارية المختلفة للواجهات البرمجية، مثل REST وSOAP وGraphQL وgRPC، يمكن المطورين من اختيار النهج الأمثل لاحتياجاتهم الخاصة، متوازنين بين الأداء والتوسع وسهولة الاستخدام.

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