Vous pouvez déclencher une fonction via une requête HTTP en utilisant
functions.https
Vous pouvez ainsi appeler une fonction synchrone via les méthodes HTTP compatibles suivantes : GET
, POST
, PUT
, DELETE
et OPTIONS
.
Les exemples de cette page sont basés sur un exemple de fonction qui se déclenche lorsque vous envoyez une requête HTTP GET
au point de terminaison des fonctions. L'exemple de fonction récupère l'heure actuelle du serveur, met en forme l'heure comme spécifié dans un paramètre de requête d'URL et envoie le résultat dans la réponse HTTP.
Déclencher une fonction avec une requête HTTP
Utiliser functions.https
pour créer une fonction qui gère le trafic
événements. Le gestionnaire d'événements d'une fonction HTTP écoute l'événement
l'événement onRequest()
,
qui prend en charge les routeurs
et les applications gérés par
avec le framework Web Express.
Utiliser des objets de requête et de réponse Express
Utilisé comme argument pour onRequest()
, l'objet Request vous permet d'accéder aux propriétés de la requête HTTP envoyée par le client, et l'objet Response vous permet d'envoyer une réponse au client.
exports.date = functions.https.onRequest((req, res) => { // ... });
Utiliser les applications Express existantes
Utiliser App comme argument pour
onRequest()
, vous pouvez
transmettre une application Express complète
à une fonction HTTP. Le code récurrent peut être déplacé
à l'intergiciel, comme indiqué ci-dessous:
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);
Appeler une fonction HTTP
Après avoir déployé une fonction HTTP, vous pouvez l'appeler via sa propre URL. L'URL comprend les éléments suivants (dans l'ordre indiqué) :
- Région (ou régions) dans laquelle vous avez déployé votre fonction. Certaines fonctions de production peuvent nécessiter de définir explicitement la position pour minimiser la latence réseau.
- Votre ID de projet Firebase
cloudfunctions.net
- Le nom de votre fonction
Par exemple, l'URL permettant d'appeler date()
se présente comme suit :
https://us-central1-<project-id>.cloudfunctions.net/date
Si vous rencontrez des erreurs d'autorisation lors du déploiement de fonctions, assurez-vous que les rôles IAM appropriés sont attribués à l'utilisateur qui exécute les commandes de déploiement.
Avec le routage d'application express, le nom de la fonction est ajouté en tant que préfixe aux chemins d'URL dans l'application que vous définissez. Par exemple, l'URL permettant d'appeler le getter dans l'exemple d'application Express ci-dessus se présente comme suit :
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
Si vous appelez des fonctions HTTP derrière un pare-feu ou un filtre IP, vous pouvez rechercher les adresses IP que Google utilise pour les fonctions HTTP.
Utiliser des modules de middleware avec Cloud Functions
Si vous devez injecter des dépendances de middleware pour des choses telles que la prise en charge des cookies ou Dans la fonction CORS, appelez-les. Par exemple, pour activer la compatibilité CORS, ajoutez le bloc suivant:
// Enable CORS using the `cors` express middleware. cors(req, res, () => { // ... });
Lire les valeurs de la requête
Le tableau suivant répertorie quelques scénarios courants:Type de contenu | Corps de la requête | Comportement |
---|---|---|
application/json |
'{"name":"John"}' |
request.body.name est égal(e) à 'John' |
application/octet-stream |
"mon texte" | request.body est égal à "6d792074657874" (les octets bruts de la requête ; consultez la documentation sur le tampon Node.js) |
text/plain |
"mon texte" | request.body correspond à "mon texte" |
application/x-www-form-urlencoded |
'name=John' | request.body.name est égal(e) à 'John' |
Cette analyse est effectuée par les analyseurs de corps suivants :
- Analyseur de corps JSON
- Analyseur du corps brut
- Analyseur du corps du texte
- Analyseur de corps de formulaire encodé au format URL
Supposons que votre fonction soit appelée avec la requête suivante:
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
alors les données envoyées seront matérialisées sous:
Propriété/Méthode | Valeur |
---|---|
req.method |
"POST" |
req.get('x-myheader') |
"123" |
req.query.foo |
"baz" |
req.body.text |
"something" |
req.rawBody |
Octets bruts (non analysés) de la requête |
Dans l'exemple de la fonction date()
, la fonction teste à la fois le paramètre d'URL et
le corps d'une valeur format
pour définir le format de date/heure à utiliser:
let format = req.query.format; format = req.body.format;
Arrêter des fonctions HTTP
Terminez toujours une fonction HTTP par send()
, redirect()
ou end()
. Sinon, votre fonction pourrait continuer à s'exécuter et être
de manière forcée par le système. Voir aussi
Synchronisation, asynchrone et promesses :
Après avoir récupéré et formaté l'heure du serveur à l'aide du code
Module moment
, la fonction date()
conclut en envoyant le résultat dans la réponse HTTP:
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
Connecter des fonctions HTTP à Firebase Hosting
Vous pouvez connecter une fonction HTTP à Firebase Hosting. Les requêtes sur votre site Firebase Hosting peuvent être transmises à des fonctions HTTP spécifiques via un proxy. Cette opération vous permet d'utiliser votre propre domaine personnalisé avec une fonction HTTP. En savoir plus sur connectant Cloud Functions à Firebase Hosting.