您可以使用 functions.https,透過 HTTP 要求觸發函式。您可以使用下列支援的 HTTP 方法,叫用同步函式:GET、POST、PUT、DELETE 和 OPTIONS。
本頁的範例是以範例函式為基礎,當您對函式端點傳送 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 等於「John」 |
application/octet-stream |
'my text' | 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。您網站上的要求可以 Proxy 至特定 HTTP 函式。Firebase Hosting您也可以使用自己的自訂網域搭配 HTTP 函式。進一步瞭解如何連線至 Cloud FunctionsFirebase Hosting。