透過 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 'my text' request.body 等於「6d792074657874」(要求的原始位元組;請參閱 Node.js 緩衝區說明文件)
text/plain 'my text' 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 「發布」
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 託管。您可以經由 Proxy 將 Firebase 託管網站上的要求傳送至特定 HTTP 函式。這也可讓您以 HTTP 函式使用自己的自訂網域。進一步瞭解如何將 Cloud Functions 連結至 Firebase 託管