אפשר להפעיל פונקציה באמצעות בקשת HTTP עם טיפול בבקשה. כך תוכלו להפעיל פונקציה באמצעות שיטות ה-HTTP הנתמכות הבאות: GET
, POST
, PUT
, DELETE
ו-OPTIONS
.
אפשרויות HTTP נוספות
אפשרות | תיאור |
---|---|
region |
פונקציות HTTP יכולות לציין מערך של אזורים וגם אזור יחיד. אם מציינים כמה אזורים, תתבצע פריסה של מכונה נפרדת של הפונקציה בכל אזור. |
timeoutSeconds (timeout_sec ל-Python) |
בפונקציות HTTP אפשר לציין זמן קצוב לתפוגה של עד שעה. |
cors |
פונקציות HTTP יכולות לציין מדיניות CORS. אפשר להגדיר את הערך הזה כ-true כדי לאפשר גישה לכל המקורות, או כ-string , regex או array כדי לציין את המקורות המורשים. אם לא מגדירים את הפרמטר במפורש, ברירת המחדל שלו היא false/no CORS policies. |
הגדרת 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!");
}
);
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
משתמשים ב-request 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 באמצעות האפליקציה כארגומנט של בורר הבקשות:
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 ו-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
אפשר לחבר פונקציית HTTP אל Firebase Hosting. אפשר להעביר בשרתי proxy בקשות באתר Firebase Hosting לפונקציות HTTP ספציפיות. כך תוכלו גם להשתמש בדומיין מותאם אישית משלכם עם פונקציית HTTP. מידע נוסף על חיבור Cloud Functions ל-Firebase Hosting