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


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

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

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

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

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

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

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

استفاده از برنامه های Express موجود

با استفاده از App به عنوان آرگومان برای 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 مناسب به کاربری که دستورات استقرار را اجرا می کند اختصاص داده شده است.

با مسیریابی برنامه Express، نام تابع به عنوان پیشوند به مسیرهای URL در برنامه ای که تعریف می کنید اضافه می شود. به عنوان مثال، URL برای فراخوانی گیرنده در مثال برنامه 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 مراجعه کنید)
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 Hosting

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