Sinatraとngrokを使ってWebhookのテストを楽にする方法
- 2015年4月28日
- by SendGrid
- Category: 技術ネタ
この記事は Simple Webhook Testing Using Sinatra and ngrok の抄訳です。
Webhookはアプリケーションとサービスを密に連携させるのに有効な方法です。でも、デバッグしようと思うと、ちょっと面倒に感じることもあります。APIマニュアル(新規会員登録が必要)ではWebhookのデバッグ方法をご紹介していますが、簡単に構築できて使いやすいWebhookのテスト環境にはどういったものがあるでしょうか?今回は、ngrokを利用してSinatraアプリケーションでWebhookを受ける方法をご紹介します。この組み合わせはかなり強力です。
node.jsを利用するのであれば、こちらのWebhookのテストに関する記事が参考になるでしょう。
はじめに
前提条件としてRubyとRubyGemsの環境が必要になります。Rubyについてあまり詳しくない場合、rbenvで環境構築するのがオススメです。
まず、新しいフォルダを作成してgem install sinatraコマンドを実行してSinatraをインストールします。インストールできたら、次に簡単なSinatraアプリを作っていきます。
webhook.rbという名前のファイルを作成します。今回は、Webhookの一例としてSendGridのEvent Webhook機能を使ってみます。
Event WebhookはボディにJSONを含みます。JSONの内容をテキストファイルに出力するコードをwebhook.rbに記述します:
require 'sinatra' require 'json' post '/event' do status 204 #successful request with no body content request.body.rewind request_payload = JSON.parse(request.body.read) puts request_payload #append the payload to a file File.open("events.txt", "a") do |f| f.puts(request_payload) end end
たったこれだけで、Sinatraは/event URLに対するPOSTリクエストを受け付けて、関連するコードを実行してくれます。
Sinatraを実行してアプリケーションをインターネットに公開する
ruby webhook.rb コマンドを実行してアプリを起動すると、SinatraはWEBrick Webサーバを起動して待ち受けポートを表示します。標準の待ち受けポートは4567です。
次に、ここで実行したインスタンスをインターネット上に公開します。ここでngrokが登場します。ngrok(version 2.0)をインストールして新しいターミナルを起動してください。ngrok http 4567コマンドを実行してngrok URLを確認してください。このngrok URLにブラウザでアクセスするとSinatra標準の「Sinatra doesn’t know this ditty.」ページを確認することができるはずです。
SendGridのEvent Notification Appにngrok URLを設定します。Sinatraアプリ上で定義した/eventをURLに追加するのを忘れないようにしましょう。
最後にEvent Notification App内の「Test Your Integration」ボタンを選択するか、Mail APIリファレンスのAPI Workshop(Try Itボタンのこと)を使ってテストします。
さいごに
SendGridからイベントが発行されると、受信したHTTPリクエストの内容がngrokを実行しているターミナルに表示されます。また、Sinatraアプリを実行しているターミナルでも同じリクエストを確認できます。
Sinatraアプリと同じフォルダ内に、以下のようなevents.txtファイルが生成されます。
{ "email"=>"john.doe@sendgrid.com", "sg_event_id"=>"VzcPxPv7SdWvUugt-xKymw", "sg_message_id"=>"142d9f3f351.7618.254f56.filter-147.22649.52A663508.0", "timestamp"=>1386636112, "smtp-id"=>"<142d9f3f351.7618.254f56@sendgrid.com>", "event"=>"processed", "category"=>["category1", "category2", "category3"], "id"=>"001", "purchase"=>"PO1452297845", "uid"=>"123456" }
以上で完了です。イベントの内容を確認するとともに、これを応用して様々なアプリケーションを開発することができます。是非お試しください!