وظائف الاستدعاء من خلال طلبات HTTP


يمكنك تشغيل دالة من خلال طلب HTTP باستخدام معالج طلب. يتيح لك ذلك استدعاء دالة من خلال طرق HTTP المتوافقة التالية: GET وPOST وPUT وDELETE وOPTIONS.

Option الوصف
region يمكن أن تحدّد دوال HTTP صفيفًا من المناطق بالإضافة إلى منطقة واحدة. عند تحديد مناطق متعدّدة، سيتم نشر نسخة منفصلة من الدالة لكل منطقة.
timeoutSeconds (timeout_sec لـ Python) يمكن أن تحدّد دوال HTTP مهلة تصل إلى ساعة واحدة.
cors قد تحدّد دوال HTTP سياسات CORS. يمكنك ضبط هذا الخيار على true للسماح بجميع المصادر أو string أو regex أو array لتحديد المصادر المسموح بها. يتم ضبط القيمة تلقائيًا على "خطأ"/"لا توجد سياسات مشاركة الموارد المتعدّدة المصادر" في حال عدم ضبطها بشكل صريح.

ضبط إعدادات مشاركة الموارد المتعدّدة المصادر (CORS)

استخدِم الخيار cors للتحكّم في المصادر التي يمكنها الوصول إلى وظيفتك. بشكلٍ تلقائي، لا يتم ضبط CORS في دوال HTTP، ما يعني أنّ أي طلب من مصادر متعددة إلى دالتك سيؤدي إلى ظهور الخطأ التالي:

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.jsPython
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!")

إذا كان من المفترض أن تكون وظيفتك متاحة للجميع، مثلاً إذا كانت تعرض واجهة برمجة تطبيقات أو موقعًا إلكترونيًا متاحًا للجميع، اضبط السياسة cors على true.

تشغيل دالة باستخدام طلب HTTP

استخدِم معالج الطلبات الخاص بمنصتك (onRequest() أو on_request) لإنشاء دالة تعالج أحداث HTTP. تستند الأمثلة الواردة في هذا القسم إلى نموذج "خادم الوقت" الذي يتم تشغيله عند إرسال طلب HTTP GET إلى نقطة نهاية الدوال. تستردّ الدالة النموذجية وقت الخادم الحالي، وتنسّق الوقت كما هو محدّد في مَعلَمة طلب بحث عنوان URL، وترسل النتيجة في استجابة HTTP.

استخدام عناصر الطلب والاستجابة

يمنحك عنصر الطلب إمكانية الوصول إلى خصائص طلب HTTP الذي أرسله العميل، بينما يمنحك عنصر الاستجابة طريقة لإرسال استجابة إلى العميل.

Node.jsPython
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.jsPython
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 الدقيق الناتج من واجهة سطر الأوامر بعد النشر.

على سبيل المثال، يبدو عنوان URL الذي يتم استخدامه لتفعيل date() على النحو التالي:

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

باستخدام توجيه التطبيقات في Express وFlask، تتم إضافة اسم الدالة كبادئة إلى مسارات عناوين URL في التطبيق الذي تحدّده.

قراءة القيم من الطلب

في مثال الدالة date()، تختبر الدالة كلاً من مَعلمة عنوان URL والنص الأساسي بحثًا عن قيمة format لضبط تنسيق التاريخ/الوقت المطلوب استخدامه:

Node.jsPython
let format = req.query.format;
format = req.body.format;
format = req.args["format"] if "format" in req.args else None

إنهاء دوال HTTP

بعد استرداد وقت الخادم وتنسيقه، تنهي الدالة date() عملها عن طريق إرسال النتيجة في استجابة HTTP:

Node.jsPython

يجب دائمًا إنهاء دالة 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