透過 HTTP 要求呼叫函式


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

本頁的範例皆以範例函式為依據,當您將 HTTP GET 要求傳送至函式端點時,就會觸發這類函式。範例函式 擷取目前的伺服器時間,將網址查詢中指定的時間格式化 參數,並在 HTTP 回應中傳送結果。

透過 HTTP 要求觸發函式

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

使用 Express 要求和回應物件

做為 onRequest() 的引數 Request 物件 您可以存取用戶端所傳送 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 函式後,您可以透過 網址。網址依序包含下列項目:

  • 您部署函式的區域。部分正式環境 函式可能需要明確設定 location 盡可能縮短網路延遲時間
  • 您的 Firebase 專案 ID
  • cloudfunctions.net
  • 函式名稱

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

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

如果您在部署函式時遇到權限錯誤,請確認 您可以查看適當的身分與存取權管理角色 執行部署指令的使用者

使用 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 Buffer 說明文件)
text/plain 'my text' request.body等於「我的文字」
application/x-www-form-urlencoded 'name=John' 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 「POST」
req.get('x-myheader') 「123」
req.query.foo 「baz」
req.body.text 「something」
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 Hosting

您可以將 HTTP 函式連結至 Firebase Hosting。要求: Firebase Hosting 網站可以經由 Proxy 處理至特定 HTTP 函式。這也讓您可以搭配 HTTP 函式使用自訂網域。進一步瞭解 Cloud Functions 連線至 Firebase Hosting