Fonctions d'appel via des requêtes HTTP


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, puis envoie le résultat dans la réponse HTTP.

Déclencher une fonction avec une requête HTTP

Utilisez functions.https pour créer une fonction qui gère les événements HTTP. Le gestionnaire d'événements d'une fonction HTTP écoute l'événement onRequest(), qui est compatible avec les routeurs et les applications gérées par le framework Web Express.

Utiliser des objets de requête et de réponse Express

Utilisé comme arguments pour onRequest(), l'objet Request vous donne accès aux propriétés de la requête HTTP envoyée par le client, tandis que l'objet Response vous permet de renvoyer une réponse au client.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

Utiliser des applications Express existantes

En utilisant App comme argument pour onRequest(), vous pouvez transmettre une application Express complète à une fonction HTTP. Le code récurrent peut être déplacé vers un middleware, 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 unique. L'URL comprend les éléments suivants, dans l'ordre:

  • Région (ou régions) dans laquelle vous avez déployé votre fonction. Certaines fonctions de production devront peut-être définir explicitement l'emplacement pour minimiser la latence du réseau.
  • ID de votre projet Firebase
  • cloudfunctions.net
  • 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. Dans l'exemple d'application Express ci-dessus, l'URL permettant d'appeler le getter 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 diffuser des fonctions HTTP.

Utiliser des modules de middleware avec Cloud Functions

Si vous devez injecter des dépendances de middleware pour des éléments tels que la compatibilité avec les cookies ou le CORS, appelez-les dans la fonction. Par exemple, pour activer la compatibilité avec 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 à "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 est égal à "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 :

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 fonction date(), la fonction teste à la fois le paramètre d'URL et le corps pour une valeur format afin de définir le format de date/heure à utiliser :

let format = req.query.format;
format = req.body.format;

Arrêter des fonctions HTTP

Finissez toujours une fonction HTTP par send(), redirect() ou end(). Sinon, votre fonction risque de continuer à s'exécuter et d'être arrêtée de manière forcée par le système. Consultez également la section Synchronisation, asynchrone et promesses.

Après avoir récupéré et mis en forme l'heure du serveur à l'aide du module Node.js moment, la fonction date() se termine 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. Cela vous permet également d'utiliser votre propre domaine personnalisé avec une fonction HTTP. Découvrez comment associer Cloud Functions à Firebase Hosting.