Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Funciones de llamada a través de solicitudes HTTP

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Puede activar una función a través de una solicitud HTTP usando functions.https . Esto le 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ía una solicitud HTTP GET al extremo de funciones. La función de ejemplo recupera la hora actual del servidor, formatea la hora como se especifica en un parámetro de consulta de URL y envía el resultado en la respuesta HTTP.

Activar una función con una solicitud HTTP

Use functions.https para crear una función que maneje eventos HTTP. El controlador de eventos para una función HTTP escucha el evento onRequest() , que admite enrutadores y aplicaciones administrados por el marco web Express .

Uso de objetos de solicitud y respuesta Express

Usado como argumentos para onRequest() , el objeto Request le brinda acceso a las propiedades de la solicitud HTTP enviada por el cliente, y el objeto Response le brinda una forma de enviar una respuesta al cliente.

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

Uso de aplicaciones Express existentes

Usando App como argumento para onRequest() , puede pasar una aplicación Express completa a una función HTTP. El código repetitivo se puede mover al middleware como se muestra:

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

Invocar una función HTTP

Después de implementar una función HTTP, puede invocarla a través de su propia URL única. La URL incluye lo siguiente, en orden:

  • La región (o regiones) en las que implementó su función. Algunas funciones de producción pueden necesitar establecer explícitamente la ubicación para minimizar la latencia de la red.
  • Su ID de proyecto de Firebase
  • cloudfunctions.net
  • El nombre de tu función.

Por ejemplo, la URL para invocar date() se ve así:

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

Si encuentra errores de permisos al implementar funciones, asegúrese de que los roles de IAM apropiados estén asignados al usuario que ejecuta los comandos de implementación.

Con el enrutamiento de la aplicación Express, el nombre de la función se agrega como un prefijo a las rutas de URL en la aplicación que defina. Por ejemplo, la URL para invocar el getter en el ejemplo anterior de la aplicación Express se ve así:

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

Si invoca funciones HTTP detrás de un cortafuegos o filtro IP, puede buscar las direcciones IP que utiliza Google para servir funciones HTTP.

Usar módulos de middleware con Cloud Functions

Si necesita inyectar dependencias de middleware para cosas como soporte de cookies o CORS, llámelos dentro de la función. Por ejemplo, para habilitar la compatibilidad con CORS, agregue el siguiente bloque:

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

Leer valores de la solicitud

La siguiente tabla enumera algunos escenarios comunes:

Tipo de contenido Cuerpo de solicitud Comportamiento
application/json '{"name":"John"}' request.body.name es igual a 'John'
application/octet-stream 'mi texto' request.body es igual a '6d792074657874' (los bytes sin procesar de la solicitud; consulte la documentación de Node.js Buffer )
text/plain 'mi texto' request.body es igual a 'mi texto'
application/x-www-form-urlencoded 'nombre=Juan' request.body.name es igual a 'John'

Este análisis lo realizan los siguientes analizadores de cuerpo:

Supongamos que se llama a su función con la siguiente solicitud:

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

entonces los datos enviados se materializarían bajo:

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

En el ejemplo de la función date() , la función prueba tanto el parámetro de URL como el cuerpo en busca de un valor de format para establecer el formato de fecha/hora a utilizar:

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

Terminar funciones HTTP

Finalice siempre una función HTTP con send() , redirect() o end() . De lo contrario, su función podría continuar ejecutándose y ser terminada por la fuerza por el sistema. Consulte también Sync, Async y Promises .

Después de recuperar y formatear la hora del servidor usando el módulo de moment de Node.js, la función date() concluye enviando el resultado en la respuesta HTTP:

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

Conexión de funciones HTTP a Firebase Hosting

Puedes conectar una función HTTP a Firebase Hosting. Las solicitudes en su sitio de alojamiento de Firebase se pueden redirigir a funciones HTTP específicas. Esto también le permite usar su propio dominio personalizado con una función HTTP. Obtén más información sobre cómo conectar Cloud Functions a Firebase Hosting .