وظائف الاستدعاء من خلال طلبات HTTP


يمكنك تشغيل دالة من خلال طلب HTTP باستخدام functions.https ويسمح لك هذا باستدعاء دالة متزامنة من خلال طرق HTTP المتوافقة التالية: GET وPOST وPUT وDELETE OPTIONS

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

تشغيل دالة باستخدام طلب HTTP

استخدام functions.https لإنشاء دالة تتعامل مع HTTP أحداث. يصغي معالج الحدث لدالة HTTP إلى حدث onRequest() الذي يتوافق مع أجهزة التوجيه والتطبيقات المُدارة بواسطة إطار عمل الويب سريع

استخدام كائنات الطلبات والاستجابة السريعة

مستخدمة كوسيطات للدالة onRequest()، يمنح الكائن Request الوصول إلى خصائص طلب HTTP الذي أرسله العميل يمنحك كائن Response طريقة إرسال الرد مرة أخرى إلى العميل.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

استخدام تطبيقات Express الحالية

استخدام التطبيق كوسيطة onRequest()، يمكنك تمرير تطبيق Express كامل إلى دالة HTTP. يمكن نقل الرمز النموذجي. إلى البرمجيات الوسيطة كما هو موضّح:

const express = require('express');
const cors = require('cors');

const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

// Add middleware to authenticate requests
app.use(myMiddleware);

// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));

// Expose Express API as a single Cloud Function:
exports.widgets = functions.https.onRequest(app);

استدعاء دالة HTTP

بعد نشر دالة HTTP، يمكنك استدعاؤها عبر نموذجها الفريد عنوان URL. يتضمن عنوان URL ما يلي، بالترتيب:

  • المنطقة (أو المناطق) التي نشرت فيها الدالة. مرحلة الإنتاج إلى تحديد الموقع الجغرافي بشكل صريح لتقليل وقت استجابة الشبكة إلى أدنى حد.
  • رقم تعريف مشروع Firebase
  • cloudfunctions.net
  • اسم الدالة

على سبيل المثال، يبدو عنوان URL المطلوب استدعاء date() بالشكل التالي:

https://us-central1-<project-id>.cloudfunctions.net/date

إذا واجهتك أخطاء في الأذونات عند نشر الدوال، تأكَّد من أدوار إدارة الهوية وإمكانية الوصول المناسبة المخصصة للمستخدم الذي يشغِّل أوامر النشر.

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

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

إذا قمت باستدعاء دوال HTTP وراء جدار حماية أو فلتر IP، يمكنك البحث عن عناوين IP التي يستخدمها محرّك بحث Google لعرض وظائف HTTP.

استخدام وحدات البرمجيات الوسيطة مع دوال السحابة

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

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

قراءة القيم من الطلب

يسرد الجدول التالي بعض السيناريوهات الشائعة:

نوع المحتوى نص الطلب السلوك
application/json '{"name":"John"}' request.body.name يساوي "جون"
application/octet-stream "الرسائل النصية الخاصة بي" request.body تساوي "6d792074657874" (وحدات البايت الأولية للطلب، راجع وثائق Node.js Buffer)
text/plain "الرسائل النصية الخاصة بي" request.body يساوي 'نصي'
application/x-www-form-urlencoded 'name=John' request.body.name يساوي "جون"

ويتم إجراء هذا التحليل باستخدام أدوات تحليل النص الأساسي التالية:

افترض أنه يتم استدعاء الدالة مع الطلب التالي:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

فستُمثل البيانات المرسلة ضمن:

الخاصية/الطريقة القيمة
req.method مشاركة
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "شيء ما"
req.rawBody وحدات البايت الأولية (غير التي تم تحليلها) للطلب

في مثال الدالة date()، تختبر الدالة كلاً من معلمة عنوان URL النص الأساسي للقيمة format لضبط تنسيق التاريخ/الوقت لاستخدامه:

let format = req.query.format;
format = req.body.format;

إنهاء دوال HTTP

إنهاء دالة HTTP دائمًا باستخدام send() وredirect() أو end(). وإلا، فقد تستمر الدالة في العمل الذي يتم إنهاؤه إجباريًا من قبل النظام. يمكن أيضًا مراجعة المزامنة وغير المتزامنة والوعود:

بعد استرداد وقت الخادم وتنسيقه باستخدام Node.js وحدة moment، الدالة date() بإرسال النتيجة في استجابة HTTP:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

ربط دوال HTTP باستضافة Firebase

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