Sie können eine Funktion über eine HTTP-Anfrage auslösen, indem Sie functions.https
verwenden. Dadurch 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
Anforderung an den Funktionsendpunkt senden. Die Beispielfunktion ruft die aktuelle Serverzeit ab, formatiert die Zeit wie in einem URL-Abfrageparameter angegeben und sendet das Ergebnis in der HTTP-Antwort.
Lösen Sie eine Funktion mit einer HTTP-Anfrage aus
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.
Verwenden von Express-Anforderungs- und -Antwortobjekten
Das Request- Objekt, das als Argumente für onRequest()
verwendet wird, gibt Ihnen Zugriff auf die Eigenschaften der vom Client gesendeten HTTP-Anfrage, und das Response- Objekt gibt Ihnen die Möglichkeit, eine Antwort an den Client zurückzusenden.
exports.date = functions.https.onRequest((req, res) => { // ... });
Verwenden vorhandener Express-Apps
TODO: Soll ich dies aus Python konditionalisieren oder gilt es?
Wenn Sie App als Argument für onRequest()
verwenden, können Sie eine vollständige Express-App an eine HTTP-Funktion übergeben. Boilerplate-Code kann wie gezeigt in 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);
Rufen Sie eine HTTP-Funktion auf
Nachdem Sie eine HTTP-Funktion bereitgestellt haben, können Sie sie über ihre eigene eindeutige URL aufrufen. Die URL enthält Folgendes in dieser Reihenfolge:
- Die Region (oder Regionen), in denen Sie Ihre Funktion bereitgestellt haben. Einige Produktionsfunktionen müssen den Standort möglicherweise explizit festlegen, um die Netzwerklatenz zu minimieren.
- Ihre Firebase-Projekt-ID
-
cloudfunctions.net
- Der Name Ihrer Funktion
Die URL zum Aufrufen date()
sieht beispielsweise so aus:
https://us-central1-<project-id>.cloudfunctions.net/date
Wenn beim Bereitstellen von Funktionen Berechtigungsfehler auftreten, stellen Sie sicher, dass dem Benutzer, der die Bereitstellungsbefehle ausführt, die entsprechenden IAM-Rollen zugewiesen sind.
Beim Express-App-Routing wird der Funktionsname als Präfix zu den URL-Pfaden in der von Ihnen definierten App hinzugefügt. Die URL zum Aufrufen des Getters im obigen Beispiel der Express-App 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 nachschlagen , die Google verwendet, um HTTP-Funktionen bereitzustellen.
Verwenden Sie Middleware-Module mit Cloud Functions
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. Um beispielsweise die CORS-Unterstützung zu aktivieren, 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 gängige Szenarien aufgeführt:Inhaltstyp | Körper anfordern | Verhalten |
---|---|---|
application/json | '{"name":"John"}' | request.body.name ist gleich 'John' |
application/octet-stream | 'mein Text' | request.body entspricht '6d792074657874' (die rohen Bytes der Anfrage; siehe Node.js Buffer-Dokumentation ) |
text/plain | 'mein Text' | request.body ist gleich 'mein Text' |
application/x-www-form-urlencoded | 'name=John' | request.body.name ist gleich 'John' |
Dieses Parsen wird von den folgenden Body-Parsern durchgeführt:
Angenommen, Ihre Funktion wird mit der folgenden Anforderung aufgerufen:
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
dann würden die gesendeten Daten materialisiert unter:
Eigenschaft/Methode | Wert |
---|---|
req.method | "POST" |
req.get('x-myheader') | "123" |
req.query.foo | "baz" |
req.body.text | "etwas" |
req.rawBody | Die rohen (ungeparsten) Bytes der Anfrage |
Im Funktionsbeispiel date()
testet die Funktion sowohl den URL-Parameter als auch den Hauptteil auf einen format
, 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 wird Ihre Funktion möglicherweise weiter ausgeführt und vom System zwangsweise beendet. Siehe auch Sync, Async und Promises .
Nach dem Abrufen und Formatieren der Serverzeit mit dem moment
Modul von Node.js schließt die Funktion date()
ab, indem sie das Ergebnis in der HTTP-Antwort sendet:
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 auf Ihrer Firebase-Hosting-Site können an bestimmte HTTP-Funktionen weitergeleitet werden. Auf diese Weise können Sie auch Ihre eigene benutzerdefinierte Domäne mit einer HTTP-Funktion verwenden. Erfahren Sie mehr über das Verbinden von Cloud Functions mit Firebase Hosting .