אפשר להפעיל פונקציה באמצעות בקשת HTTP עם handler של בקשה. כך אפשר להפעיל פונקציה באמצעות ה-methods הבאות של HTTP שנתמכות: GET
, POST
, PUT
, DELETE
ו-OPTIONS
.
אפשרויות נוספות של HTTP
אפשרות | תיאור |
---|---|
region |
פונקציות HTTP יכולות לציין מערך של אזורים וגם אזור יחיד. כשמציינים כמה אזורים, מתבצע פריסה של מופע פונקציה נפרד לכל אזור. |
timeoutSeconds (timeout_sec ל-Python) |
פונקציות HTTP יכולות לציין זמן קצוב לתפוגה של עד שעה. |
cors |
פונקציות HTTP יכולות לציין מדיניות CORS. אפשר להגדיר את הערך true כדי לאפשר את כל המקורות, או להגדיר את הערך string , regex או array כדי לציין את המקורות המותרים. אם לא מגדירים במפורש, ברירת המחדל היא false או ללא מדיניות CORS. |
הגדרת שיתוף משאבים בין מקורות (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$/, 'https://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$/, "https://flutter.com"] },
(req, res) => {
res.status(200).send("Hello world!");
}
);
Python
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
משתמשים ב-handler של הבקשות לפלטפורמה שלכם (onRequest()
או on_request
) כדי ליצור פונקציה שמטפלת באירועי HTTP. הדוגמאות בקטע הזה מבוססות על דוגמה של 'שרת זמן' שמופעל כששולחים בקשת HTTP GET
לנקודת הקצה של הפונקציות. פונקציית הדוגמה מאחזרת את השעה הנוכחית בשרת, מעצבת את השעה כפי שמצוין בפרמטר של שאילתת URL ושולחת את התוצאה בתגובת ה-HTTP.
שימוש באובייקטים של בקשות ותגובות
אובייקט הבקשה מאפשר לכם לגשת למאפיינים של בקשת ה-HTTP שנשלחה על ידי הלקוח, ואובייקט התשובה מאפשר לכם לשלוח תשובה בחזרה ללקוח.
Node.js
exports.date = onRequest( {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]}, (req, res) => { // ... });
Python
@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 באמצעות האפליקציה כארגומנט עבור handler הבקשות:
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);
Python
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;
Python
format = req.args["format"] if "format" in req.args else None
הפסקת פונקציות HTTP
אחרי שליפת זמן השרת ועיצובו, הפונקציה date()
מסיימת את הפעולה בשליחת התוצאה בתגובת ה-HTTP:
Node.js
תמיד מסיימים פונקציית HTTP עם send()
, redirect()
או end()
. אחרת, יכול להיות שהפונקציה תמשיך לפעול והמערכת תפסיק אותה בכוח. אפשר לעיין גם במאמר Sync, Async and Promises.
const formattedDate = moment().format(`${format}`); logger.log("Sending formatted date:", formattedDate); res.status(200).send(formattedDate);
Python
formatted_date = datetime.now().strftime(format)
print(f"Sending Formatted date: {formatted_date}")
return https_fn.Response(formatted_date)
שילוב עם Firebase Hosting
אפשר לקשר פונקציית HTTP אל Firebase Hosting. אפשר להעביר בקשות באתר Firebase Hosting באמצעות פרוקסי לפונקציות HTTP ספציפיות. בנוסף, תוכלו להשתמש בדומיין מותאם אישית משלכם עם פונקציית HTTP. מידע נוסף על קישור Cloud Functions אל Firebase Hosting