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

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

گزینه‌های اضافی HTTP
گزینه توضیحات
region توابع HTTP می‌توانند آرایه‌ای از مناطق و همچنین یک منطقه واحد را مشخص کنند. وقتی چندین منطقه مشخص می‌شوند، برای هر منطقه یک نمونه تابع جداگانه مستقر می‌شود.
timeoutSeconds ( timeout_sec برای پایتون) توابع HTTP می‌توانند تا یک ساعت زمان انقضا تعیین کنند.
cors توابع HTTP ممکن است سیاست‌های CORS را مشخص کنند. می‌توانید این را روی true تنظیم کنید تا به همه مبدأها یا یک string ، regex یا array اجازه دهید مبدأهای مجاز را مشخص کنند. اگر به صراحت سیاست‌های CORS تنظیم نشده باشند، پیش‌فرض‌ها روی false/no هستند.
پیکربندی CORS (اشتراک‌گذاری منابع بین مبدا)

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

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

همچنین می‌توانید با تنظیم گزینه cors روی false برای تابع خود، CORS را به طور صریح غیرفعال کنید.

برای مجاز کردن برخی از درخواست‌های بین‌مرجعی، اما نه همه آنها، می‌توانید فهرستی از دامنه‌های خاص یا عبارات منظمی که باید مجاز باشند را ارسال کنید. برای مثال، اگر مالک دامنه‌های firebase.com و flutter.com هستید و firebase.com می‌تواند زیردامنه‌های زیادی داشته باشد، می‌توانید گزینه cors را برای Node.js روی [/firebase\.com$/, 'https://flutter.com'] یا برای پایتون [r'firebase\.com$', r'https://flutter\.com'] تنظیم کنید:

نود جی اس
const { onRequest } = require("firebase-functions/v2/https");

exports.sayHello = onRequest(
  { cors: [/firebase\.com$/, "https://flutter.com"] },
  (req, res) => {
    res.status(200).send("Hello world!");
  }
);
پایتون
from firebase_functions import https_fn, options

@https_fn.on_request(
    cors=options.CorsOptions(
        cors_origins=[r"firebase\.com$", r"https://flutter\.com"],
        cors_methods=["get", "post"],
    )
)
def say_hello(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

اگر تابع شما باید به صورت آزاد در دسترس باشد، مثلاً اگر به یک API عمومی یا وب‌سایت سرویس می‌دهد، سیاست cors را روی true تنظیم کنید.

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

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

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

شیء درخواست (request object) به شما امکان دسترسی به ویژگی‌های درخواست HTTP ارسال شده توسط کلاینت را می‌دهد و شیء پاسخ (response object) راهی برای ارسال پاسخ به کلاینت فراهم می‌کند.

نود جی اس
exports.date = onRequest(
    {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]},
    (req, res) => {
// ...
});
پایتون
@https_fn.on_request(cors=options.CorsOptions(cors_origins="*", cors_methods=["get", "post"]))
def date(req: https_fn.Request) -> https_fn.Response:
    """Get the server's local date and time."""
استفاده از برنامه‌های Express یا Flask موجود

با استفاده از app به عنوان آرگومان برای کنترل‌کننده درخواست، می‌توانید یک app کامل را به یک تابع HTTP ارسال کنید:

نود جی اس
const { onRequest } = require('firebase-functions/v2/https');

const express = require('express');
const app = express();

// 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 = onRequest(app);
پایتون
from firebase_admin import initialize_app, db
from firebase_functions import https_fn
import flask

initialize_app()
app = flask.Flask(__name__)

# Build multiple CRUD interfaces:


@app.get("/widgets")
@app.get("/widgets/<id>")
def get_widget(id=None):
    if id is not None:
        return db.reference(f"/widgets/{id}").get()
    else:
        return db.reference("/widgets").get()


@app.post("/widgets")
def add_widget():
    new_widget = flask.request.get_data(as_text=True)
    db.reference("/widgets").push(new_widget)
    return flask.Response(status=201, response="Added widget")


# Expose Flask app as a single Cloud Function:


@https_fn.on_request()
def httpsflaskexample(req: https_fn.Request) -> https_fn.Response:
    with app.request_context(req.environ):
        return app.full_dispatch_request()
فراخوانی یک تابع HTTP

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

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

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

با مسیریابی برنامه Express و Flask، نام تابع به عنوان پیشوند به مسیرهای URL در برنامه‌ای که تعریف می‌کنید اضافه می‌شود.

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

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

نود جی اس
let format = req.query.format;
format = req.body.format;
پایتون
format = req.args["format"] if "format" in req.args else None
خاتمه دادن به توابع HTTP

پس از بازیابی و قالب‌بندی زمان سرور، تابع date() با ارسال نتیجه در پاسخ HTTP به پایان می‌رسد:

نود جی اس

همیشه یک تابع HTTP را با send() ، redirect() یا end() خاتمه دهید. در غیر این صورت، ممکن است تابع شما به اجرا ادامه دهد و به اجبار توسط سیستم خاتمه یابد. همچنین به Sync، Async و Promises مراجعه کنید.

const formattedDate = moment().format(`${format}`);
logger.log("Sending formatted date:", formattedDate);
res.status(200).send(formattedDate);
پایتون
formatted_date = datetime.now().strftime(format)
print(f"Sending Formatted date: {formatted_date}")
return https_fn.Response(formatted_date)
ادغام با میزبانی فایربیس

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