functions.https
を使用して、HTTP 要求を介して関数をトリガーできます。これにより、次のサポートされている HTTP メソッドを介して同期関数を呼び出すことができます: GET
、 POST
、 PUT
、 DELETE
、およびOPTIONS
。
このページの例は、関数エンドポイントに HTTP GET
要求を送信するとトリガーされるサンプル関数に基づいています。サンプル関数は、現在のサーバー時刻を取得し、URL クエリ パラメーターで指定されたとおりに時刻をフォーマットし、結果を HTTP 応答で送信します。
HTTP リクエストで関数をトリガーする
functions.https を使用して、HTTP イベントを処理するfunctions.https
を作成します。 HTTP 関数のイベント ハンドラーはonRequest()
イベントをリッスンします。このイベントは、 Express Web フレームワークによって管理されるルーターとアプリをサポートします。
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 関数をデプロイした後、独自の一意の URL を介して呼び出すことができます。 URL には、次のものが順番に含まれています。
- 関数をデプロイしたリージョン (複数可)。一部の運用機能では、ネットワークの待機時間を最小限に抑えるために場所を明示的に設定する必要がある場合があります。
- Firebase プロジェクト ID
-
cloudfunctions.net
- 関数の名前
たとえば、 date()
を呼び出す URL は次のようになります。
https://us-central1-<project-id>.cloudfunctions.net/date
関数のデプロイ時に権限エラーが発生した場合は、デプロイ コマンドを実行しているユーザーに適切なIAM ロールが割り当てられていることを確認してください。
Express アプリ ルーティングでは、定義したアプリの URL パスに関数名がプレフィックスとして追加されます。たとえば、上記の Express アプリの例でゲッターを呼び出す URL は次のようになります。
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 equals '6d792074657874' (リクエストの raw バイト。Node.jsバッファのドキュメントを参照) |
text/plain | 「私のテキスト」 | request.body は「私のテキスト」に等しい |
application/x-www-form-urlencoded | 「名前=ジョン」 | 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 | 「バズ」 |
req.body.text | "なにか" |
req.rawBody | リクエストの生の (解析されていない) バイト |
date()
関数の例では、関数は URL パラメーターと本文の両方をテストして、使用する日付/時刻形式を設定するformat
の値を確認します。
let format = req.query.format; format = req.body.format;
HTTP 関数の終了
HTTP 関数は必ずsend()
、 redirect()
、またはend()
で終了してください。そうしないと、関数が引き続き実行され、システムによって強制的に終了される可能性があります。同期、非同期、約束も参照してください。
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 サイトのリクエストは、特定の HTTP 関数にプロキシできます。これにより、HTTP 関数で独自のカスタム ドメインを使用することもできます。 Cloud Functions を Firebase Hosting に接続する方法の詳細をご覧ください。