您可以使用请求处理程序通过 HTTP 请求触发函数。这样您就能通过以下受支持的 HTTP 方法调用函数:GET
、POST
、PUT
、DELETE
和 OPTIONS
。
其他 HTTP 选项
选项 | 说明 |
---|---|
region |
HTTP 函数可以指定一组区域以及单个区域。如果指定了多个区域,则将为每个区域部署一个单独的函数实例。 |
timeoutSeconds (对于 Python 则为 timeout_sec ) |
HTTP 函数可以指定长达一小时的超时。 |
cors |
HTTP 函数可以指定 CORS 政策。您可将此选项设置为 true 以允许所有来源,或设置为 string 、regex 或 array 以指定允许的来源。如果未明确设置,则默认为“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.com
和 flutter.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。