Llama a funciones mediante solicitudes HTTP


Puedes activar una función a través de una solicitud HTTP mediante functions.https. Esto te permite invocar una función síncrona a través de los siguientes métodos HTTP admitidos: GET, POST, PUT, DELETE y OPTIONS.

Los ejemplos de esta página se basan en una función de muestra que se activa cuando envías una solicitud HTTP GET al extremo de las funciones. La función de muestra recupera la hora actual del servidor, formatea el tiempo según se especifica en un parámetro de consulta de URL y envía el resultado en la respuesta HTTP.

Activa una función con una solicitud HTTP

Usa functions.https para crear una función que controle eventos HTTP. El controlador de eventos de una función HTTP detecta el evento onRequest() compatible con routers y apps que administra el framework web Express.

Usa los objetos Request y Response de Express

El objeto Request, que se usa como argumento para onRequest(), te da acceso a las propiedades de la solicitud HTTP que envió el cliente, mientras que el objeto Response te proporciona una manera de enviar una respuesta al cliente.

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

Usa apps de Express existentes

Si usas App como argumento de onRequest(), puedes pasar una app de Express completa a una función HTTP. El código estándar se puede mover a middleware tal como se muestra a continuación:

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);

Invoca una función HTTP

Después de implementar una función HTTP, puedes invocarla mediante su propia URL única, que incluye los siguientes elementos en este orden:

  • Las regiones en las que implementaste la función. Es posible que debas configurar la ubicación de algunas funciones de producción de manera explícita para minimizar la latencia de red
  • El ID del proyecto de Firebase
  • cloudfunctions.net
  • El nombre de la función

Por ejemplo, la URL para invocar date() tiene el siguiente aspecto:

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

Si ves errores de permisos cuando implementas funciones, asegúrate de que se asignen los roles de IAM adecuados al usuario que ejecuta los comandos de implementación.

Con el enrutamiento de apps de Express, el nombre de la función se agrega como prefijo a las rutas de URL en la app que definas. Por ejemplo, la URL para invocar el método get en el ejemplo anterior de la app de Express es similar a la siguiente:

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

Si invocas funciones HTTP detrás de un firewall o un filtro de IP, puedes buscar las direcciones IP que usa Google para entregar las funciones.

Usa módulos de middleware con Cloud Functions

Si necesitas inyectar dependencias de middleware para aspectos como la compatibilidad con cookies o CORS, llama a estos elementos dentro de la función. Por ejemplo, para habilitar la compatibilidad con CORS, agrega el siguiente bloque:

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

Lee los valores de la solicitud

En la siguiente tabla, se muestran algunas situaciones comunes:

Tipo de contenido Cuerpo de la solicitud Comportamiento
application/json '{"name":"John"}' request.body.name equivale a “John”.
application/octet-stream 'my text' request.body equivale a “6d792074657874” (los bytes sin procesar de la solicitud; consulta la documentación del búfer de Node.js).
text/plain 'my text' request.body equivale a “mi texto”.
application/x-www-form-urlencoded 'name=John' request.body.name equivale a “John”.

Los siguientes analizadores de cuerpo realizan este análisis:

Supongamos que se usa la siguiente solicitud para llamar a tu función:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

Los datos enviados se materializarían de la siguiente manera:

Propiedad/Método Valor
req.method "POST"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "something"
req.rawBody Los bytes sin procesar (sin analizar) de la solicitud

En el ejemplo de la función date(), se prueban tanto el parámetro de URL como el cuerpo para verificar el valor de format para configurar el formato de fecha y hora que se usará:

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

Finaliza funciones de HTTP

Siempre termina una función de HTTP con send(), redirect() o end(). De lo contrario, tu función podría seguir ejecutándose, y el sistema podría forzar su finalización. Consulta también Síncrono, asíncrono y promesas.

Después de recuperar la hora del servidor y darle formato mediante el módulo moment de Node.js, la función date() concluye con el envío del resultado en la respuesta HTTP:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Conecta funciones de HTTP a Firebase Hosting

Puedes conectar una función de HTTP a Firebase Hosting. Las solicitudes en tu sitio de Firebase Hosting se pueden dirigir a funciones de HTTP específicas. Esto también te permite usar tu propio dominio personalizado con una función HTTP. Obtén más información para conectar Cloud Functions a Firebase Hosting.