Ir a la consola

Llama a funciones mediante solicitudes HTTP

Puedes activar una función a través de una solicitud de 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 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 de HTTP detecta el evento onRequest() compatible con routers y apps que administra el marco de trabajo 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 el argumento de onRequest(), puedes pasar una app de Express completa a una función de 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

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 la función getter en el ejemplo anterior de la app de Express es similar a la siguiente:

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

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.
return cors(req, res, () => {  // ...
});

Lee los valores de la solicitud

El cuerpo de la solicitud se analiza automáticamente según el encabezado content-type y se encuentra disponible mediante los argumentos de la función de HTTP.

La siguiente tabla muestra 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 “my text”
application/x-www-form-urlencoded 'name=John' request.body.name equivale a “John”

Los siguientes analizadores de cuerpo de la solicitud 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 en:

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

En el ejemplo de la función date(), la función prueba el parámetro de URL y el cuerpo para un valor format a fin de configurar el formato de fecha y hora que se usará:

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

Finaliza funciones 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 la secció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);
console.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.