فراخوانی توابع ازطریق درخواست‌های HTTP (نسل اول)

بااستفاده از functions.https می‌توانید ازطریق درخواست HTTP، تابعی را راه‌اندازی کنید. این به شما امکان می‌دهد تا یک تابع همگام را ازطریق روش‌های HTTP پشتیبانی‌شده زیر فراخوانی کنید: GET، POST، PUT، DELETE، و OPTIONS.

نمونه‌های این صفحه براساس تابع نمونه‌ای است که وقتی درخواست HTTP GET به نقطه پایانی توابع ارسال می‌کنید، راه‌اندازی می‌شود. تابع نمونه زمان فعلی سرور را بازیابی می‌کند، زمان را طبق آنچه در پارامتر پُرسمان نشانی وب مشخص شده است قالب‌بندی می‌کند، و نتیجه را در پاسخ HTTP ارسال می‌کند.

راه‌اندازی تابع با درخواست اچ‌تی‌تی‌پی

از functions.https برای ایجاد تابعی که رویدادهای HTTP را مدیریت می‌کند استفاده کنید. گرداننده رویداد برای تابع HTTP به رویداد onRequest() گوش می‌دهد، که از مسیریاب‌ها و برنامه‌های مدیریت‌شده توسط چارچوب وب Express پشتیبانی می‌کند.

استفاده از اشیای درخواست و پاسخ Express

شیء درخواست که به‌عنوان آرگومان برای onRequest() استفاده می‌شود، به شما امکان می‌دهد به ویژگی‌های درخواست HTTP ارسال‌شده توسط کارخواه دسترسی داشته باشید، و شیء پاسخ به شما امکان می‌دهد پاسخی به کارخواه ارسال کنید.

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، می‌توانید آن را ازطریق نشانی وب منحصربه‌فرد خودش فراخوانی کنید. نشانی وب به‌ترتیب شامل موارد زیر است:

  • منطقه‌ای (یا مناطقی) که تابع خود را در آن مستقر کرده‌اید. برخی‌از عملکردهای تولید ممکن است نیاز داشته باشند که مکان را به‌طور صریح تنظیم کنند تا تأخیر شبکه را به حداقل برسانند.
  • شناسه پروژه Firebase شما
  • cloudfunctions.net
  • نام تابع شما

برای مثال، نشانی وب برای فراخوانی date() به‌این‌صورت است:

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

اگر هنگام استقرار توابع با خطاهای مربوط به اجازه‌ها مواجه شدید، مطمئن شوید که نقش‌های IAM مناسب به کاربری که فرمان‌های استقرار را اجرا می‌کند اختصاص داده شده باشد.

با مسیریابی برنامه Express، نام تابع به‌عنوان پیشوند به مسیرهای نشانی وب در برنامه‌ای که تعریف می‌کنید اضافه می‌شود. برای مثال، نشانی وب برای فراخوانی گیرنده در نمونه برنامه Express در بالا به‌صورت زیر است:

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

اگر توابع HTTP را پشت دیوار آتش یا فیلتر IP فراخوانی می‌کنید، می‌توانید نشانی‌های IP را که Google برای ارائه توابع HTTP استفاده می‌کند جستجو کنید.

استفاده از میان‌افزار با Cloud Functions

اگر لازم است وابستگی‌های میان‌افزار را برای مواردی مثل پشتیبانی از کوکی یا CORS تزریق کنید، این موارد را در تابع فراخوانی کنید. برای مثال، برای فعال کردن پشتیبانی CORS، بلوک زیر را اضافه کنید:

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

خواندن مقادیر از درخواست

جدول زیر برخی‌از سناریوهای رایج را فهرست می‌کند:

نوع محتوا متن درخواست رفتار
application/json '{"name":"John"}' ‫request.body.name برابر است با «John»
application/octet-stream 'my text' request.body برابر است با «6d792074657874» (بایت‌های خام درخواست؛ به اسناد Node.js Buffer مراجعه کنید)
text/plain 'my text' request.body برابر با «نوشتار من» است
application/x-www-form-urlencoded 'name=John' ‫request.body.name برابر است با «John»

این تجزیه توسط تجزیه‌کننده‌های بدنه زیر انجام می‌شود:

فرض کنید تابع شما با درخواست زیر فراخوانی می‌شود:

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

سپس داده‌های ارسال‌شده تحت این عنوان محقق می‌شود:

ویژگی/روش مقدار
req.method «POST»
req.get('x-myheader') «۱۲۳»
req.query.foo «baz»
req.body.text «چیزی»
req.rawBody بایت‌های خام (تجزیه‌نشده) درخواست

در مثال تابع date()، تابع هم پارامتر نشانی وب و هم بدنه را برای مقدار format آزمایش می‌کند تا قالب تاریخ/زمان را برای استفاده تنظیم کند:

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

فسخ کردن توابع اچ‌تی‌تی‌پی

همیشه تابع 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);

درحال اتصال توابع اچ‌تی‌تی‌پی به Firebase Hosting

می‌توانید تابع HTTP را به Firebase Hosting متصل کنید. درخواست‌های سایت Firebase Hosting شما می‌تواند به عملکردهای خاص HTTP پروکسی شود. این کار همچنین به شما امکان می‌دهد از دامنه سفارشی خودتان با تابع HTTP استفاده کنید. درباره اتصال Cloud Functions به Firebase Hosting بیشتر بدانید.