Twilio FunctionsでGETおよびPOSTを1つのハンドラーメソッドで処理するには
読む所要時間: 6 分
Twilio FunctionsはNode.jsで動作するサーバレス実行環境です。この環境にはTwilio Node ヘルパーライブラリーがあらかじめて組み込まれているためすぐ利用できます。また、オートスケール機能やセキュリティ機能などプロダクション向けのサーバレスアプリケーションを簡単かつ迅速に構築できます。
Twilio FunctionsでGETとPOSTを判断する方法
このTwilio FunctionsはGET
、POST
、OPTIONS
メソッドに対応しています。ただし、Functionsで呼び出されるハンドラーメソッドではリクエストヘッダにアクセスできないため、どのメソッドか判断できません。そのため、GETとPOSTでハンドルするFunctionを明示的に別にするという運用が考えられます。ただし、外部APIによっては1つのエンドポイントで両方のメソッドに対応しなければいけない場合があります。たとえばTwitch Webhookは1つのエンドポイントに対してイベントの購読確認(Subscription Verify)と通知(Notification)を、それぞれGET、POSTで行います。そのため、1つのエンドポイントで両方に対応しなければなりません。
将来的には改善されることを期待しますが、現時点ではリクエストで渡されるパラメータから判断し、それぞれに対応した処理を行う方法が考えられます。
Twitch Webhookの場合
Subscription Verify (GET
)の場合は、hub.challenge
という名前のパラメータが text/plain
で渡されます。一方、Notification (POST
) の場合はサブスクライブしたTopic(イベント)に合わせたパラメータがjson
で渡されます。
Stream Changed (ストリーミングの配信開始や配信タイトルの変更が発生したイベント)の場合は下記のようになります。
これらのパラメータはハンドラーメソッドに渡されるevent
引数に格納されるため、GET用のパラメータなのか、POST用パラメータなのかを判断し、処理を分岐させることになります。
試してみる
- 必要な環境
- Node.js / npmがローカル環境にインストールされていること
- Twilio CLIおよびServerless Toolkitをインストールし、プロファイルを作成していること
参考: Twilio CLIハンズオン - Postmanなどの
GET
/POST
リクエストを送信できるツール、または、curl
コマンドを使用
次のコマンドで余計なファイルが存在しないTwilio Functionsプロジェクトを作成します。
プロジェクトフォルダに移動し、続けて次のコマンドでGET
、POST
両方に対応するためのハンドラーメソッドを作成します。
Blank.js
を開き次のように変更します。
次のコマンドを実行し、ローカルホストで動作させます。
http://localhost:3000/twitch/blank
に条件を変えてアクセスしてみましょう。
何もパラメータを付与せずにGET
メソッドでアクセスした場合
hub.challenge
をtext/plain形式でパラメータに設定し、GET
メソッドを使った場合
data
をjson形式でBodyに設定し、POST
メソッドを使った場合
サンプルはこちらからアクセスできます。
まとめ
今回の方法はパラメータから判定しているので厳密にはリクエストメソッドの判定ではありませんが、1つのハンドラーメソッドでGET/POSTリクエストを処理しなければいけない場合に利用できます。
このエントリについての問い合わせ
- Twitter (@Neri78)
- Email: dikehara@twilio.com
- Github: https://github.com/neri78
- Twitch: https://twitch.tv/neri78