Funktionen über HTTP-Anfragen aufrufen

Sie können eine Funktion über eine HTTP-Anfrage mit einem Anfrage-Handler 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 kann ein Array von Regionen sowie 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 nicht explizit festgelegt, wird standardmäßig „false“ bzw. keine CORS-Richtlinien verwendet.

CORS (Cross-Origin Resource Sharing) konfigurieren

Mit der Option cors können Sie steuern, welche Ursprünge auf Ihre Funktion zugreifen können. Für HTTP-Funktionen ist CORS standardmäßig nicht konfiguriert. 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 ursprungsü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 für Node.js auf [/firebase\.com$/, 'https://flutter.com'] oder für Python auf [r'firebase\.com$', r'https://flutter\.com'] festlegen:

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

Wenn Ihre Funktion öffentlich verfügbar sein soll, z. B. wenn sie eine öffentliche API oder Website bereitstellt, legen Sie die cors-Richtlinie auf 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 „Zeitserver“-Beispiel, das ausgelöst wird, wenn Sie eine HTTP-GET-Anfrage an den Endpunkt der Funktion senden. Die Beispielfunktion ruft die aktuelle Serverzeit ab, formatiert sie gemäß einem URL-Suchparameter und sendet das Ergebnis in der HTTP-Antwort.

Anfrage- und Antwortobjekte verwenden

Über das Anfrageobjekt haben Sie Zugriff auf die Attribute der HTTP-Anfrage, die vom Client gesendet wurde. Über das 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 ihre eigene eindeutige URL aufrufen. Verwenden Sie die genaue URL, die nach der Bereitstellung in der CLI ausgegeben wird.

Die URL zum Aufrufen von date() sieht beispielsweise so aus:

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

Bei der Routenplanung von Express- und Flask-Apps wird der Funktionsname als Präfix für die URL-Pfade in der von Ihnen definierten App hinzugefügt.

Werte aus der Anfrage lesen

Im Beispiel für die Funktion date() 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, wird das Ergebnis mit der Funktion date() in der HTTP-Antwort gesendet:

Node.js

Beenden Sie HTTP-Funktionen immer mit send(), redirect() oder end(). Andernfalls kann Ihre Funktion weiterhin ausgeführt und vom System zwangsweise beendet werden. Siehe auch 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)

Integration in Firebase Hosting

Sie können eine HTTP-Funktion mit Firebase Hosting verbinden. Anfragen an Ihre Firebase Hosting-Website können 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