يمكنك تشغيل دالة من خلال طلب HTTP باستخدام معالج طلب. يتيح لك ذلك استدعاء دالة من خلال طرق HTTP المتوافقة التالية: GET
وPOST
وPUT
وDELETE
وOPTIONS
.
خيارات HTTP الإضافية
Option | الوصف |
---|---|
region |
يمكن أن تحدّد دوال HTTP صفيفًا من المناطق بالإضافة إلى منطقة واحدة. عند تحديد مناطق متعدّدة، سيتم نشر نسخة منفصلة من الدالة لكل منطقة. |
timeout (timeout_ لـ 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:
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 الذي أرسله العميل، بينما يمنحك عنصر الاستجابة طريقة لإرسال استجابة إلى العميل.
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:
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
لضبط تنسيق التاريخ/الوقت المطلوب استخدامه:
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()
. بخلاف ذلك، قد يستمر تنفيذ الدالة وقد يوقفها النظام بالقوة. راجِع أيضًا
المزامنة وغير المتزامنة والوعود.
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