Funciones de llamada a través de solicitudes HTTP


Puede activar una función a través de una solicitud HTTP utilizando functions.https . Esto le permite invocar una función sincrónica 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 ejemplo que se activa cuando envía una solicitud HTTP GET al punto final de funciones. La función de ejemplo recupera la hora actual del servidor, formatea la hora según lo especificado en un parámetro de consulta URL y envía el resultado en la respuesta HTTP.

Activar una función con una solicitud HTTP

Utilice 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 administradas por el marco web Express .

Uso de objetos de solicitud y respuesta exprés

Usado como argumento 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 manera de enviar una respuesta al cliente.

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

Usar aplicaciones Express existentes

Al usar 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. Es posible que algunas funciones de producción necesiten establecer explícitamente la ubicación para minimizar la latencia de la red.
  • El ID de tu proyecto de Firebase
  • cloudfunctions.net
  • El nombre de tu función.

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

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

Si encuentra errores de permisos al implementar funciones, asegúrese de que se asignen las funciones de IAM adecuadas al usuario que ejecuta los comandos de implementación.

Con el enrutamiento de aplicaciones Express, el nombre de la función se agrega como prefijo a las rutas URL en la aplicación que usted define. Por ejemplo, la URL para invocar el captador 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 firewall o filtro de IP, puede buscar las direcciones IP que utiliza Google para ofrecer funciones HTTP.

Utilice 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 del búfer de Node.js )
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 en:

Propiedad/Método Valor
req.method "CORREO"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "algo"
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 URL como el cuerpo en busca de un valor format para establecer el formato de fecha/hora a usar:

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 el sistema la finalizará por la fuerza. Consulte también Sincronización, Asíncrono y Promesas .

Después de recuperar y formatear la hora del servidor usando el módulo 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

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