Sie können eine Funktion über eine HTTP-Anfrage mit functions.https auslösen. So können Sie eine synchrone Funktion über die folgenden unterstützten HTTP-Methoden aufrufen: GET, POST, PUT, DELETE und OPTIONS.
Die Beispiele auf dieser Seite basieren auf einer Beispielfunktion, die 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.
Funktion mit einer HTTP-Anfrage auslösen
Verwenden Sie functions.https, um eine Funktion zu erstellen, die HTTP-Ereignisse verarbeitet. Der Ereignishandler für eine HTTP-Funktion wartet auf das Ereignis onRequest(), das Router und Apps unterstützt, die vom Express-Webframework verwaltet werden.
Express-Anfrage- und ‑Antwortobjekte verwenden
Das Request-Objekt wird als Argument für onRequest() verwendet und bietet Zugriff auf die Eigenschaften der vom Client gesendeten HTTP-Anfrage. Das Response-Objekt ermöglicht es, eine Antwort an den Client zurückzusenden.
exports.date = functions.https.onRequest((req, res) => { // ... });
Vorhandene Express-Apps verwenden
Wenn Sie App als Argument für onRequest() verwenden, können Sie eine vollständige Express-App an eine HTTP-Funktion übergeben. Der Boilerplate-Code kann wie unten gezeigt in die Middleware verschoben werden:
const express = require('express');
const cors = require('cors');
const app = express();
// Automatically allow cross-origin requests
app.use(cors({ origin: true }));
// 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 = functions.https.onRequest(app);
HTTP-Funktion aufrufen
Nachdem Sie eine HTTP-Funktion bereitgestellt haben, können Sie sie über ihre eigene eindeutige URL aufrufen. Die URL enthält Folgendes in der angegebenen Reihenfolge:
- Die Region (en), in der bzw. denen Sie Ihre Funktion bereitgestellt haben. Bei einigen Produktionsfunktionen muss der Standort möglicherweise explizit festgelegt werden, um die Netzwerklatenz zu minimieren.
- Ihre Firebase-Projekt-ID
cloudfunctions.net- Der Name Ihrer Funktion
Die URL zum Aufrufen von date() sieht beispielsweise so aus:
https://us-central1-<project-id>.cloudfunctions.net/date
Wenn beim Bereitstellen von Funktionen Berechtigungsfehler auftreten, prüfen Sie, ob dem Nutzer, der die Bereitstellungsbefehle ausführt, die entsprechenden IAM-Rollen zugewiesen sind.
Beim Express-App-Routing wird der Funktionsname als Präfix für die URL-Pfade in der von Ihnen definierten App hinzugefügt. Die URL zum Aufrufen des Getters im obigen Express-App-Beispiel sieht beispielsweise so aus:
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
Wenn Sie HTTP-Funktionen hinter einer Firewall oder einem IP-Filter aufrufen, können Sie die IP-Adressen, die Google zum Bereitstellen von HTTP-Funktionen verwendet, nachschlagen.
Middleware-Module mit Cloud Functions verwenden
Wenn Sie Middleware-Abhängigkeiten für Dinge wie Cookie-Unterstützung oder CORS einfügen müssen, rufen Sie diese innerhalb der Funktion auf. Wenn Sie beispielsweise die CORS-Unterstützung aktivieren möchten, fügen Sie den folgenden Block hinzu:
// Enable CORS using the `cors` express middleware. cors(req, res, () => { // ... });
Werte aus der Anfrage lesen
In der folgenden Tabelle sind einige häufige Szenarien aufgeführt:| Inhaltstyp | Anfragetext | Verhalten |
|---|---|---|
application/json |
'{"name":"John"}' |
request.body.name entspricht „Max“ |
application/octet-stream |
„mein Text“ | request.body entspricht „6d792074657874“ (den Rohbytes der Anfrage; siehe Node.js-Dokumentation zu Buffer) |
text/plain |
„mein Text“ | request.body entspricht „mein Text“ |
application/x-www-form-urlencoded |
'name=John' | request.body.name entspricht „Max“ |
Das Parsing erfolgt durch die folgenden Body-Parser:
Angenommen, Ihre Funktion wird mit der folgenden Anfrage aufgerufen:
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
Die gesendeten Daten würden dann unter folgendem Pfad gespeichert:
| Attribut/Methode | Wert |
|---|---|
req.method |
"POST" |
req.get('x-myheader') |
„123“ |
req.query.foo |
„baz“ |
req.body.text |
„etwas“ |
req.rawBody |
Die Rohbyte (nicht geparst) der Anfrage |
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:
let format = req.query.format; format = req.body.format;
HTTP-Funktionen beenden
Beenden Sie eine HTTP-Funktion 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.
Nachdem die Serverzeit mit dem Node.js-Modul moment abgerufen und formatiert wurde, wird das Ergebnis mit der Funktion date() in der HTTP-Antwort gesendet:
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
HTTP-Funktionen mit Firebase Hosting verbinden
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