Catch up on highlights from Firebase at Google I/O 2023. Learn more

通過 HTTP 請求調用函數


您可以使用functions.https通過 HTTP 請求觸發函數。這允許您通過以下受支持的 HTTP 方法調用同步函數: GETPOSTPUTDELETEOPTIONS

此頁面中的示例基於在您向函數端點發送 HTTP GET請求時觸發的示例函數。示例函數檢索當前服務器時間,按照 URL 查詢參數中指定的格式設置時間格式,然後在 HTTP 響應中發送結果。

使用 HTTP 請求觸發函數

使用functions.https創建一個處理 HTTP 事件的函數。 HTTP 函數的事件處理程序偵聽onRequest()事件,該事件支持由Express Web 框架管理的路由器和應用程序。

使用 Express 請求和響應對象

作為onRequest()的參數, Request對象使您可以訪問客戶端發送的 HTTP 請求的屬性, Response對象為您提供了一種將響應發送回客戶端的方法。

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

使用現有的 Express 應用程序

TODO:我應該從 Python 中將其條件化,還是它適用?

使用App作為onRequest()的參數,您可以將完整的 Express 應用程序傳遞給 HTTP 函數。樣板代碼可以移動到中間件,如下所示:

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

const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

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

調用 HTTP 函數

部署 HTTP 函數後,您可以通過它自己的唯一 URL 調用它。該 URL 按順序包括以下內容:

  • 您將函數部署到的一個或多個區域。一些生產函數可能需要明確設置位置以最小化網絡延遲。
  • 您的 Firebase 項目 ID
  • cloudfunctions.net
  • 你的函數的名稱

例如,調用date()的 URL 如下所示:

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

如果您在部署函數時遇到權限錯誤,請確保將適當的IAM 角色分配給運行部署命令的用戶。

使用 Express 應用程序路由,函數名稱將作為前綴添加到您定義的應用程序中的 URL 路徑。例如,在上面的 Express 應用程序示例中調用 getter 的 URL 如下所示:

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

如果您在防火牆或 IP 過濾器後面調用 HTTP 功能,您可以查找Google 用於提供 HTTP 功能的 IP 地址。

將中間件模塊與 Cloud Functions 結合使用

如果您需要為 cookie 支持或 CORS 之類的東西注入中間件依賴項,請在函數中調用它們。例如,要啟用 CORS 支持,請添加以下塊:

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

從請求中讀取值

下表列出了一些常見的場景:

內容類型請求正文行為
application/json '{"name":"John"}' request.body.name等於'John'
application/octet-stream '我的文字' request.body等於 '6d792074657874'(請求的原始字節;請參閱Node.js 緩衝區文檔
text/plain '我的文字' request.body等於'我的文字'
application/x-www-form-urlencoded '名字=約翰' request.body.name等於'John'

此解析由以下正文解析器完成:

假設使用以下請求調用您的函數:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

那麼發送的數據將在以下情況下具體化:

屬性/方法價值
req.method “郵政”
req.get('x-myheader') “123”
req.query.foo “巴茲”
req.body.text “某物”
req.rawBody請求的原始(未解析)字節

date()函數示例中,該函數測試 URL 參數和正文中的format值以設置要使用的日期/時間格式:

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

終止 HTTP 函數

始終以send()redirect()end()結束 HTTP 函數。否則,您的函數可能會繼續運行並被系統強行終止。另請參閱同步、異步和承諾

使用 Node.js moment模塊檢索和格式化服務器時間後, date()函數通過在 HTTP 響應中發送結果來結束:

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

將 HTTP 函數連接到 Firebase 託管

您可以將 HTTP 函數連接到 Firebase 託管。您的 Firebase 託管站點上的請求可以代理到特定的 HTTP 函數。這還允許您將自己的自定義域與 HTTP 函數一起使用。詳細了解如何將 Cloud Functions 連接到 Firebase 託管