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

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

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

فعال کردن یک تابع با یک درخواست HTTP

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

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

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

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

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

با استفاده از App به عنوان آرگومان برای onRequest() ، می‌توانید یک برنامه کامل Express را به یک تابع HTTP ارسال کنید. کد Boilerplate را می‌توان همانطور که نشان داده شده است به middleware منتقل کرد:

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 به ترتیب شامل موارد زیر است:

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

برای مثال، آدرس اینترنتی (URL) برای فراخوانی date() به این شکل است:

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

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

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

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

اگر توابع HTTP را از پشت یک فایروال یا فیلتر IP فراخوانی کنید، می‌توانید آدرس‌های IP که گوگل برای ارائه توابع 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 برابر با 'my text' است.
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') «۱۲۳»
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() خاتمه دهید. در غیر این صورت، ممکن است تابع شما به اجرا ادامه دهد و به اجبار توسط سیستم خاتمه یابد. همچنین به Sync، Async و Promises مراجعه کنید.

پس از بازیابی و قالب‌بندی زمان سرور با استفاده از ماژول moment Node.js، تابع 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 بیشتر بدانید.