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 muestra 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 | Conducta |
---|---|---|
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:
- Analizador de cuerpo JSON
- Analizador de cuerpo sin procesar
- Analizador de cuerpo de texto
- Analizador de cuerpo de formulario con codificación URL
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 | "PUBLICAR" |
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 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 .