Funciones de llamada a través de solicitudes HTTP


Puede activar una función a través de una solicitud HTTP con un controlador de solicitudes. Esto le permite invocar una función a través de los siguientes métodos HTTP admitidos: GET , POST , PUT , DELETE y OPTIONS .

Opciones HTTP adicionales

Opción Descripción
region Las funciones HTTP pueden especificar una serie de regiones, así como una sola región. Cuando se especifican varias regiones, se implementará una instancia de función independiente para cada región.
timeoutSeconds ( timeout_sec para Python) Las funciones HTTP pueden especificar un tiempo de espera de hasta una hora.
cors Las funciones HTTP pueden especificar políticas CORS. Puede establecer esto en true para permitir que todos los orígenes o una string , regex o array especifiquen los orígenes permitidos. El valor predeterminado es falso/sin políticas CORS si no se establece explícitamente.

Configuración de CORS (intercambio de recursos entre orígenes)

Utilice la opción cors para controlar qué orígenes pueden acceder a su función. De forma predeterminada, las funciones HTTP no tienen CORS configurado, lo que significa que cualquier solicitud de origen cruzado a su función genera este error:

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

También puede deshabilitar CORS explícitamente configurando la opción cors en false para su función.

Para permitir algunas solicitudes de orígenes cruzados, pero no todas, puede pasar una lista de dominios específicos o expresiones regulares que deberían permitirse. Por ejemplo, si posee los dominios firebase.com y flutter.com , y firebase.com puede tener muchos subdominios, es posible que desee configurar la opción cors en [/firebase\.com$/, 'flutter.com'] para Node.js o [r'firebase\.com$', r'https://flutter\.com'] para Python:

Nodo.js

const { onRequest } = require("firebase-functions/v2/https");

exports.sayHello = onRequest(
  { cors: [/firebase\.com$/, "flutter.com"] },
  (req, res) => {
    res.status(200).send("Hello world!");
  }
);

Pitón

from firebase_functions import https_fn, options

@https_fn.on_request(
    cors=options.CorsOptions(
        cors_origins=[r"firebase\.com$", r"https://flutter\.com"],
        cors_methods=["get", "post"],
    )
)
def say_hello(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

Si su función debe estar disponible abiertamente, por ejemplo, si sirve a una API o sitio web público, establezca la política cors en true .

Activar una función con una solicitud HTTP

Utilice el controlador de solicitudes para su plataforma ( onRequest() o on_request ) para crear una función que maneje eventos HTTP. Los ejemplos de esta sección se basan en un ejemplo de "servidor de tiempo" 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.

Usar objetos de solicitud y respuesta

El objeto de solicitud le brinda acceso a las propiedades de la solicitud HTTP enviada por el cliente, y el objeto de respuesta le brinda una forma de enviar una respuesta al cliente.

Nodo.js

exports.date = onRequest(
    {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]},
    (req, res) => {
// ...
});

Pitón

@https_fn.on_request(cors=options.CorsOptions(cors_origins="*", cors_methods=["get", "post"]))
def date(req: https_fn.Request) -> https_fn.Response:
    """Get the server's local date and time."""

Uso de aplicaciones Express o Flask existentes

Usando la aplicación como argumento para el controlador de solicitudes, puedes pasar una aplicación completa a una función HTTP:

Nodo.js

const { onRequest } = require('firebase-functions/v2/https');

const express = require('express');
const app = express();

// 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 = onRequest(app);

Pitón

from firebase_admin import initialize_app, db
from firebase_functions import https_fn
import flask

initialize_app()
app = flask.Flask(__name__)

# Build multiple CRUD interfaces:


@app.get("/widgets")
@app.get("/widgets/<id>")
def get_widget(id=None):
    if id is not None:
        return db.reference(f"/widgets/{id}").get()
    else:
        return db.reference("/widgets").get()


@app.post("/widgets")
def add_widget():
    new_widget = flask.request.get_data(as_text=True)
    db.reference("/widgets").push(new_widget)
    return flask.Response(status=201, response="Added widget")


# Expose Flask app as a single Cloud Function:


@https_fn.on_request()
def httpsflaskexample(req: https_fn.Request) -> https_fn.Response:
    with app.request_context(req.environ):
        return app.full_dispatch_request()

Invocar una función HTTP

Después de implementar una función HTTP, puede invocarla a través de su propia URL única. Utilice la salida URL exacta de la CLI después de la implementación.

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

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

Con el enrutamiento de aplicaciones Express y Flask, el nombre de la función se agrega como prefijo a las rutas URL en la aplicación que usted define.

Leer valores 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:

Nodo.js

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

Pitón

format = req.args["format"] if "format" in req.args else None

Terminar funciones HTTP

Después de recuperar y formatear la hora del servidor, la función date() concluye enviando el resultado en la respuesta HTTP:

Nodo.js

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 .

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

Pitón

formatted_date = datetime.now().strftime(format)
print(f"Sending Formatted date: {formatted_date}")
return https_fn.Response(formatted_date)

Integración con alojamiento Firebase

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 .