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 de 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:
- Analizador de cuerpo de JSON
- Analizador de cuerpo sin procesar
- Analizador de cuerpo de texto
- Analizador de cuerpo de formulario con codificación URL
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 con Firebase Hosting
Puedes conectar una función HTTP con Firebase Hosting. Las solicitudes en tu sitio de Firebase Hosting se pueden dirigir a funciones HTTP específicas. Esto también te permite usar tu propio dominio personalizado con una función HTTP. Obtén más información sobre cómo conectar Cloud Functions con Firebase Hosting.