فراخوانی توابع از طریق درخواست های 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 را با تنظیم گزینه cors روی false برای عملکرد خود به صراحت غیرفعال کنید.

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

Node.js

const { onRequest } = require("firebase-functions/v2/https");

exports.sayHello = onRequest(
  { cors: [/firebase\.com$/, "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 ارسال می کند.

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

شی درخواست به شما امکان دسترسی به خصوصیات درخواست HTTP ارسال شده توسط سرویس گیرنده را می دهد و شی پاسخ به شما راهی برای ارسال پاسخ به مشتری می دهد.

Node.js

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 موجود

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

Node.js

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 آزمایش می کند تا قالب تاریخ/زمان مورد استفاده را تنظیم کند:

Node.js

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

پایتون

format = req.args["format"] if "format" in req.args else None

توابع HTTP را خاتمه دهید

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

Node.js

همیشه یک تابع HTTP را با send() , redirect() یا end() پایان دهید. در غیر این صورت، عملکرد شما ممکن است به کار خود ادامه دهد و به اجبار توسط سیستم خاتمه یابد. به همگام‌سازی، همگام‌سازی و وعده‌ها نیز مراجعه کنید.

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)

ادغام با میزبانی Firebase

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