透過 HTTP 要求呼叫函式


您可以使用 functions.https,透過 HTTP 要求觸發函式。這可讓您透過下列支援的 HTTP 方法叫用同步函式:GETPOSTPUTDELETEOPTIONS

本頁中的範例是以您在傳送 HTTP GET 要求至函式端點時觸發的範例函式為基礎。範例函式會擷取目前的伺服器時間,將網址查詢參數中指定的時間設定成格式,然後在 HTTP 回應中傳送結果。

透過 HTTP 要求觸發函式

使用 functions.https 建立處理 HTTP 事件的函式。HTTP 函式的事件處理常式會監聽 onRequest() 事件,該事件支援 Express 網路架構管理的路由器和應用程式。

使用 Express 要求和回應物件

Request 物件做為 onRequest() 的引數,可讓您存取用戶端所傳送 HTTP 要求的屬性,而 Response 物件可讓您將回應傳回用戶端。

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

使用現有的 Express 應用程式

使用 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 函式後,您可以透過其專屬網址叫用這個函式。網址依序包含下列內容:

  • 您部署函式的區域。某些實際工作環境函式可能需要明確設定位置,將網路延遲降到最低。
  • 您的 Firebase 專案 ID
  • cloudfunctions.net
  • 函式名稱

舉例來說,叫用 date() 的網址看起來會像這樣:

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

如果您在部署函式時遇到權限錯誤,請確定已將適當的 IAM 角色指派給執行部署指令的使用者。

使用 Express 應用程式轉送功能時,函式名稱會以前置字串的形式新增至您定義的應用程式網址路徑中。例如,在上述 Express 應用程式範例中,叫用 getter 的網址如下所示:

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 等於「大明」
application/octet-stream 我的文字 request.body 等於 「6d792074657874」(要求的原始位元組;請參閱 Node.js 緩衝區說明文件)
text/plain 我的文字 request.body等於「我的文字」
application/x-www-form-urlencoded 「name=大明」 request.body.name 等於「大明」

這項剖析作業是由下列主體剖析器完成:

假設使用下列要求呼叫函式:

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

那麼傳送的資料則會依照下方定義進行具體化:

屬性/方法
req.method 「POST」
req.get('x-myheader') 「123」
req.query.foo 「baz」
req.body.text 「某個東西」
req.rawBody 要求的原始 (未剖析) 位元組

date() 函式範例中,函式會測試網址參數和 format 值主體,設定要使用的日期/時間格式:

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

終止 HTTP 函式

一律以 send()redirect()end() 結尾 HTTP 函式。否則,您的函式可能會繼續執行,並遭系統強制終止。另請參閱同步處理、非同步和 Promise

使用 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 託管網站上的要求可以經由 Proxy 處理至特定的 HTTP 函式。這也可讓您搭配 HTTP 函式使用自己的自訂網域。進一步瞭解如何將 Cloud Functions 連線至 Firebase 託管