通过 HTTP 请求调用函数


您可以使用请求处理程序通过 HTTP 请求触发函数。这样您就能通过以下受支持的 HTTP 方法调用函数:GETPOSTPUTDELETEOPTIONS

其他 HTTP 选项

选项 说明
region HTTP 函数可以指定一组区域以及单个区域。如果指定了多个区域,则将为每个区域部署一个单独的函数实例。
timeoutSeconds(对于 Python 则为 timeout_sec HTTP 函数可以指定长达一小时的超时。
cors HTTP 函数可以指定 CORS 政策。您可将此选项设置为 true 以允许所有来源,或设置为 stringregexarray 以指定允许的来源。如果未明确设置,则默认为“false/no CORS”政策。

配置 CORS(跨域资源共享)

您可以使用 cors 选项控制哪些来源可以访问您的函数。默认情况下,HTTP 函数不会配置 CORS,这意味着向您的函数发出任何跨域请求都会导致以下错误:

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

您还可以通过将函数的 cors 选项设置为 false 来明确停用 CORS。

若要允许部分(而非全部)跨域请求,您可以传递应允许的特定网域或正则表达式的列表。例如,如果您拥有网域 firebase.comflutter.com,而 firebase.com 可以有多个子网域,那么您可能需要将 cors 选项设置为 [/firebase\.com$/, 'flutter.com'](对于 Node.js)或 [r'firebase\.com$', r'https://flutter\.com'](对于 Python):

Node.js

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

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

Python

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!")

如果您的函数应该是公开提供的(例如,如果它提供公共 API 或网站),请将 cors 政策设置为 true

使用 HTTP 请求来触发函数

使用适用于您的平台的请求处理程序(onRequest()on_request)创建一个用于处理 HTTP 事件的函数。本部分中的示例基于当您向函数端点发送 HTTP GET 请求时触发的“时间服务器”示例。该示例函数会检索当前的服务器时间,按网址查询参数中的要求格式化该时间,并在 HTTP 响应中发送结果。

使用请求和响应对象

您可以通过请求对象访问客户端发送的 HTTP 请求的属性,通过响应对象向客户端回发响应。

Node.js

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

Python

@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."""

使用现有的 Express 或 Flask 应用

使用应用作为请求处理程序的参数,您可以将一个完整应用传递给 HTTP 函数:

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

Python

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

调用 HTTP 函数

部署 HTTP 函数后,您可以通过函数专属的网址来对其进行调用。部署后,请使用 CLI 输出的确切网址。

例如,用于调用 date() 的网址如下所示:

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

对于 Express 和 Flask 应用路由,函数名称会作为前缀添加到您定义的应用中的网址路径。

从请求中读取值

date() 函数示例中,函数会同时测试网址参数和正文,以获取 format 值来设置要使用的日期/时间格式:

Node.js

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

Python

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

终止 HTTP 函数

检索服务器时间并设置其格式后,date() 函数会在 HTTP 响应中发送结果并结束:

Node.js

务必使用 send()redirect()end() 结束 HTTP 函数。否则,您的函数可能会继续运行,然后被系统强行终止。另请参阅同步、异步和 Promise

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

Python

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

与 Firebase Hosting 集成

您可以将 HTTP 函数关联到 Firebase Hosting。您的 Firebase Hosting 网站上的请求可以被代理到特定的 HTTP 函数。这还可以让您将自己的自定义域名用于 HTTP 函数。详细了解如何Cloud Functions 关联到 Firebase Hosting