透過 HTTP 要求呼叫函式


您可以透過含有要求處理常式的 HTTP 要求觸發函式。這可讓您透過下列支援的 HTTP 方法叫用函式:GETPOSTPUTDELETEOPTIONS

其他 HTTP 選項

選項 說明
region HTTP 函式可指定區域陣列和單一區域。如果指定多個區域,系統會為每個區域部署個別的函式執行個體。
timeoutSeconds (Python 為 timeout_sec) HTTP 函式最多可指定一小時的逾時時間。
cors HTTP 函式可能會指定 CORS 政策。您可以將其設為 true,允許所有來源,或是使用 stringregexarray 指定允許的來源。如果未明確設定,則預設為 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.comflutter.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 HostingFirebase Hosting 網站上的要求可以轉送至特定 HTTP 函式。這也讓您可以搭配 HTTP 函式使用自訂網域。進一步瞭解如何Cloud Functions 連結至 Firebase Hosting