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


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

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

قم بتشغيل وظيفة بطلب HTTP

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

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

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

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

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

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

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 .