Google is committed to advancing racial equity for Black communities. See how.
Cette page a été traduite par l'API Cloud Translation.
Switch to English

Fonctions d'appel via des requêtes HTTP

Vous pouvez déclencher une fonction via une requête HTTP à l'aide de functions.https . Cela vous permet d'appeler une fonction synchrone via les méthodes HTTP prises en charge 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, formate l'heure comme spécifié dans un paramètre de requête URL et 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' onRequest() , qui prend en charge les routeurs et les applications gérés par l' infrastructure Web Express .

Utilisation d'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, et l'objet Response vous donne un moyen de renvoyer une réponse au client.

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

Utilisation des applications Express existantes

En utilisant App comme argument pour onRequest() , vous pouvez passer une application Express complète à une fonction HTTP. Le code Boilerplate peut être déplacé vers le middleware comme indiqué:

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'invoquer via sa propre URL unique. L'URL comprend les éléments suivants, dans l'ordre:

  • La ou les régions dans lesquelles vous avez déployé votre fonction. Certaines fonctions de production peuvent avoir besoin de définir explicitement l' emplacement pour minimiser la latence du réseau.
  • Votre ID de projet Firebase
  • cloudfunctions.net
  • Le nom de votre fonction

Par exemple, l'URL pour appeler date() ressemble à ceci:

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

Si vous rencontrez des erreurs d'autorisations lors du déploiement de fonctions, assurez-vous que les rôles IAM appropriés sont attribués à l'utilisateur exécutant 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 pour appeler le getter dans l'exemple d'application Express ci-dessus ressemble à ceci:

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 servir les fonctions HTTP.

Utiliser des modules middleware avec Cloud Functions

Si vous avez besoin d'injecter des dépendances middleware pour des choses comme la prise en charge des cookies ou CORS, appelez-les dans la fonction. Par exemple, pour activer la prise en charge CORS, ajoutez le bloc suivant:

// Enable CORS using the `cors` express middleware.
return cors(req, res, () => {
  // ...
});

Lire les valeurs de la demande

Le tableau suivant répertorie certains scénarios courants:

Type de contenu Demander le corps Comportement
application/json '{"name":"John"}' request.body.name est égal à «John»
application/octet-stream 'mon texte' request.body équivaut à '6d792074657874' (les octets bruts de la requête; voir la documentation Node.js Buffer )
text/plain 'mon texte' request.body est égal à "mon texte"
application/x-www-form-urlencoded 'name = John' request.body.name est égal à «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"}'

puis les données envoyées seraient matérialisées sous:

Propriété / Méthode Valeur
req.method "PUBLIER"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "quelque chose"
req.rawBody Les octets bruts (non analysés) de la requête

Dans l'exemple de la fonction date() , la fonction teste à la fois le paramètre URL et le corps pour une valeur de format à définir le format de date / heure à utiliser:

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

Terminer les fonctions HTTP

Terminez toujours une fonction HTTP avec send() , redirect() ou end() . Sinon, votre fonction pourrait continuer à s'exécuter et être interrompue de force par le système. Voir aussi Sync, Async et Promises .

Après avoir récupéré et formaté l'heure du serveur à l'aide du module moment Node.js, la fonction date() termine par l'envoi du résultat dans la réponse HTTP:

const formattedDate = moment().format(format);
console.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Connexion des fonctions HTTP à Firebase Hosting

Vous pouvez connecter une fonction HTTP à Firebase Hosting. Les requêtes sur votre site d'hébergement Firebase peuvent être envoyées par proxy vers des fonctions HTTP spécifiques. Cela vous permet également d'utiliser votre propre domaine personnalisé avec une fonction HTTP. En savoir plus sur la connexion de Cloud Functions à Firebase Hosting .