您可以使用 functions.https,透過 HTTP 要求觸發函式。這可讓您透過下列支援的 HTTP 方法叫用同步函式:GET、POST、PUT、DELETE 和 OPTIONS。
本頁範例是以範例函式為基礎,當您向函式端點傳送 HTTP GET 要求時,就會觸發該函式。範例函式會擷取目前的伺服器時間、按照網址查詢參數中指定的方式設定時間格式,然後在 HTTP 回應中傳送結果。
透過 HTTP 要求觸發函式
使用 functions.https 建立處理 HTTP 事件的函式。HTTP 函式的事件處理常式會監聽 onRequest() 事件,該事件支援由 Express 網頁架構管理的路由器和應用程式。
使用 Express 要求和回應物件
Request 物件和 Response 物件可做為 onRequest() 的引數,前者可讓您存取用戶端傳送的 HTTP 要求屬性,後者則可讓您將回應傳回用戶端。
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 緩衝區說明文件) |
text/plain |
'my text' | request.body 等於「my text」 |
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 函式
HTTP 函式一律以 send()、redirect() 或 end() 結尾。否則,函式可能會繼續執行,並由系統強制終止。另請參閱同步、非同步和 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。