Sie können eine Funktion über eine HTTP-Anfrage mit einem Anfragehandler auslösen. So können Sie eine Funktion über die folgenden unterstützten HTTP-Methoden aufrufen: GET
, POST
, PUT
, DELETE
und OPTIONS
.
Zusätzliche HTTP-Optionen
Option | Beschreibung |
---|---|
region |
Für HTTP-Funktionen können mehrere Regionen oder eine einzelne Region angegeben werden. Wenn mehrere Regionen angegeben werden, wird für jede Region eine separate Funktionsinstanz bereitgestellt. |
timeoutSeconds (timeout_sec für Python) |
Für HTTP-Funktionen kann ein Zeitlimit von bis zu einer Stunde angegeben werden. |
cors |
Für HTTP-Funktionen können CORS-Richtlinien angegeben werden. Sie können diesen Wert auf true setzen, um alle Ursprünge zuzulassen, oder auf string , regex oder array , um zulässige Ursprünge anzugeben. Wenn das Attribut nicht explizit festgelegt wird, ist der Standardwert „false“ (keine CORS-Richtlinien). |
CORS (Cross-Origin Resource Sharing) konfigurieren
Mit der Option cors
können Sie festlegen, welche Ursprünge auf Ihre Funktion zugreifen können. Für HTTP-Funktionen ist standardmäßig keine CORS-Konfiguration festgelegt. Das bedeutet, dass jede Cross-Origin-Anfrage an Ihre Funktion zu diesem Fehler führt:
request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Sie können CORS auch explizit deaktivieren, indem Sie die Option cors
für Ihre Funktion auf false
setzen.
Wenn Sie einige, aber nicht alle plattformübergreifenden Anfragen zulassen möchten, können Sie eine Liste mit bestimmten Domains oder regulären Ausdrücken übergeben, die zulässig sein sollen. Wenn Sie beispielsweise die Domains firebase.com
und flutter.com
besitzen und firebase.com
viele Subdomains haben kann, können Sie die Option cors
auf [/firebase\.com$/, 'flutter.com']
für Node.js oder [r'firebase\.com$', r'https://flutter\.com']
für Python festlegen:
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!")
Wenn Ihre Funktion öffentlich verfügbar sein soll, z. B. wenn sie für eine öffentliche API oder Website verwendet wird, legen Sie für die cors
-Richtlinie den Wert true
fest.
Funktion mit einer HTTP-Anfrage auslösen
Verwenden Sie den Anfrage-Handler für Ihre Plattform (onRequest()
oder on_request
), um eine Funktion zu erstellen, die HTTP-Ereignisse verarbeitet. Die Beispiele in diesem Abschnitt basieren auf einem Beispiel für einen „Zeitserver“, der ausgelöst wird, wenn Sie eine HTTP-GET
-Anfrage an den Funktionsendpunkt senden. Die Beispielfunktion ruft die aktuelle Serverzeit ab, formatiert die Zeit gemäß einem URL-Suchparameter und sendet das Ergebnis in der HTTP-Antwort.
Anfrage- und Antwortobjekte verwenden
Über das Anfrageobjekt haben Sie Zugriff auf die Eigenschaften der vom Client gesendeten HTTP-Anfrage. Mit dem Antwortobjekt können Sie eine Antwort an den Client zurücksenden.
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."""
Vorhandene Express- oder Flask-Apps verwenden
Wenn Sie die App als Argument für den Anfrage-Handler verwenden, können Sie eine vollständige App an eine HTTP-Funktion übergeben:
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-Funktion aufrufen
Nachdem Sie eine HTTP-Funktion bereitgestellt haben, können Sie sie über eine eigene eindeutige URL aufrufen. Verwenden Sie nach der Bereitstellung die genaue URL-Ausgabe aus der Befehlszeile.
Die URL zum Aufrufen von date()
sieht beispielsweise so aus:
https://us-central1-<project-id>.cloudfunctions.net/date
Beim Express- und Flask-App-Routing wird der Funktionsname den URL-Pfaden in der von Ihnen definierten App als Präfix hinzugefügt.
Werte aus der Anfrage lesen
Im Beispiel für die date()
-Funktion wird sowohl der URL-Parameter als auch der Textkörper auf einen format
-Wert geprüft, um das zu verwendende Datums-/Uhrzeitformat festzulegen:
Node.js
let format = req.query.format; format = req.body.format;
Python
format = req.args["format"] if "format" in req.args else None
HTTP-Funktionen beenden
Nachdem die Serverzeit abgerufen und formatiert wurde, sendet die date()
-Funktion das Ergebnis in der HTTP-Antwort:
Node.js
Eine HTTP-Funktion muss immer mit send()
, redirect()
oder end()
enden. Andernfalls wird die Funktion möglicherweise weiter ausgeführt und vom System zwangsweise beendet. Siehe auch Synchronisieren, asynchron und verspricht.
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 einbinden
Sie können eine HTTP-Funktion mit Firebase Hosting verknüpfen. Anfragen auf Ihrer Firebase Hosting-Website können über einen Proxy an bestimmte HTTP-Funktionen weitergeleitet werden. So können Sie auch Ihre eigene benutzerdefinierte Domain mit einer HTTP-Funktion verwenden. Weitere Informationen zum Verbinden von Cloud Functions mit Firebase Hosting