وظائف الاتصال عبر طلبات HTTP


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

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

تشغيل دالة بطلب HTTP

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

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

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

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

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

باستخدام App كوسيطة لـ 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

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

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

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

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

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

إذا كنت بحاجة إلى إضافة تبعيات البرامج الوسيطة لأشياء مثل دعم ملفات تعريف الارتباط أو CORS، فاستدعها داخل الوظيفة. على سبيل المثال، لتمكين دعم 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 'الاسم=جون' 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 "باز"
req.body.text "شئ ما"
req.rawBody البايتات الأولية (غير المحللة) للطلب

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

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

إنهاء وظائف HTTP

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

بعد استرجاع وتنسيق وقت الخادم باستخدام الوحدة moment Node.js، تنتهي وظيفة 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. تعرف على المزيد حول ربط وظائف السحابة باستضافة Firebase .