Activadores 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 GET de HTTP 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 HTTP detecta el evento onRequest(), que admite routers y apps administrados por el marco de trabajo web de Express.

Cómo usar los objetos request y response de Express

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

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

Cómo usar las apps de Express

Si usas App como el argumento para 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:

let app = express();

// Automatically allow cross-origin requests
app.use(express.cors());

// 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 a través de su propia URL única. La URL incluye lo siguiente (en este orden):

  • la región en la que se implementa la función
  • 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.
cors(req, res, () => {
  // ...
});

Cómo leer los valores de la solicitud

El cuerpo de la solicitud se analiza automáticamente según el encabezado content-type y se llena en el cuerpo del objeto request. 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 de 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 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 Código síncrono, asíncrono y promesas.

Después de recuperar y formatear el tiempo del servidor con el módulo moment de Node.js, la función date() concluye mediante 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 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.

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.