您可以透過含有要求處理常式的 HTTP 要求觸發函式。這可讓您透過下列支援的 HTTP 方法叫用函式:GET
、POST
、PUT
、DELETE
和 OPTIONS
。
其他 HTTP 選項
選項 | 說明 |
---|---|
region |
HTTP 函式可指定區域陣列和單一區域。如果指定多個區域,系統會為每個區域部署個別的函式執行個體。 |
timeoutSeconds (Python 為 timeout_sec ) |
HTTP 函式最多可指定一小時的逾時時間。 |
cors |
HTTP 函式可能會指定 CORS 政策。您可以將其設為 true ,允許所有來源,或是使用 string 、regex 或 array 指定允許的來源。如果未明確設定,則預設為 false/沒有 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
選項設為 Node.js 的 [/firebase\.com$/, 'flutter.com']
,或 Python 的 [r'firebase\.com$', r'https://flutter\.com']
:
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 函式。否則,函式可能會繼續執行,並遭系統強制終止。另請參閱「同步、非同步和承諾」。
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 託管服務整合
您可以將 HTTP 函式連結至 Firebase Hosting。Firebase Hosting 網站上的要求可以轉送至特定 HTTP 函式。這也讓您可以搭配 HTTP 函式使用自訂網域。進一步瞭解如何將 Cloud Functions 連結至 Firebase Hosting。