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

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

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

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

از functions.https برای ایجاد تابعی که رویدادهای HTTP را مدیریت می‌کند استفاده کنید. مدیر رویداد برای یک تابع HTTP به رویداد onRequest() گوش می‌دهد، که از مسیریاب‌ها و برنامه‌های مدیریت‌شده توسط چارچوب وب 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 مناسب به کاربری که دستورات استقرار را اجرا می‌کند اختصاص داده شده است.

با مسیریابی برنامه «سریع»، نام تابع به‌عنوان پیشوند به مسیرهای نشانی وب در برنامه‌ای که تعریف می‌کنید اضافه می‌شود. برای مثال، نشانی وب برای فراخوانی getter در برنامه 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 برابر با «جان»
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 «POST»
req.get('x-myheader') «۱۲۳»
req.query.foo «باز»
req.body.text «چیزی»
req.rawBody بایت‌های خام (تجزیه‌نشده) درخواست

در مثال تابع date()، تابع هم پارامتر نشانی وب و هم بدنه را برای مقدار 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 Hosting

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