Webhookについて
Webhookとは何でしょうか。
※既にWebhookご存知の方は、SalesforceでのWebhook作成節をご覧ください。
まずはRedhatの記事をお読みになってください。
クライアントはサーバーにある最新情報を取得することに例えます。
サーバーの最新情報を得るため、クライアント側は、サーバー側へHTTPリクエスト発信し続けて、最新状態を主動的にプール(ポーリングとも言います)します。しかし、最新情報を得るために、発信し続けなければならく、通信資源が消耗され、効率はよくありません。
一方、もしサーバー側で、最新情報があったら、クライアント側へ発信することが出来たら、情報更新されるたびに、サーバーから一回の発信で済みます。
一回の送受信で最新情報を得られようにすることは、サーバー側の発信は何等かのトリガーでロジックを組めばいいが、クライアント側は発信を受け取るための仕掛けが必要です。
このクライアント仕掛けはWebhookのことです。
上記の例は、クライアント/サーバーのS/Cパータンを例にしています。
API同士でWebhook利用していることが多くあります。
SalesforceのWebhookは何が出来るでしょうか。
Salesforceは、外部ERPを皮切り、外部WMSや会計システムなど外部サービスといった外部システム連携することが多々あります。外部システムで提供したPackage(パッケージ)、APIなどを利用して、簡易に連携出来ますが、それ以外の外部システムと送受信することは、カスタム開発が必要になります。
WebhookはSalesforce上の受信触点となり、外部システムからの情報を取得します。
SalesforceでのWebhook作成
制作過程
・新規Restful API作成
受信するためのAPEXを実装
・新規Site作成
外部からアクセス可能にする
・SiteにRestful APIを関連する
新規Restful API作成
通常のRestfulAPIの作成と同じです。
例にしているのが「Webhook_Tracking」クラスで、「tracking」というAPIです。
@RestResource(urlMapping = '/tracking/*')
global with sharing class Webhook_Tracking {
@HttpPost
global static ReturnMessage doPost(WebhookPaylod payload){
return new ReturnMessage();
}
@HttpGet
global static ReturnMessage doGet(){
return new ReturnMessage();
}
global class WebhookPaylod{
global String event_id;
global String event_type;
global String tracking_number;
global String tracking_update_id;
global String date_added;
global String tracking_status;
}
global class ReturnMessage{
global String msg{ get; set;}
global Integer code {get; set;}
global ReturnMessage(){
msg = 'Calling successed. But Nothing return';
code = 401;
}
}
}
新規Site作成
・Setup→UserInteface→Sites and Domains→Sitesへアクセスします。
・必須項目記入して、保存してください。
Active Site Home Page項目は、任意のページでいいです。
その他項目は、そのままでいいです。
・新規作成したSiteにアクセス
例にしたのは「webhook」というSiteです。
SiteにRestful APIを関連する
・SiteのPublic Acess Settingsをクリックして、Restful API のApexにアクセス権限を付与
・疎通テスト
{Domain Name}/services/apexrest/{urlMapping}/へアクセスして、疎通確認。
APEXクラスのurlMappingは「tracking」なので、ここは{Domain Name}/services/apexrest/tracking/へアクセス
結果は想定通りでした! Webhook成功
セキュリティについて
SalesforceのSiteはユーザーの認証不要で、アクセス可能のため、セキュリティ面に十分ご注意ください。
・SitesのPublic Acess Settingsは、いつも最小限度のアクセス権限付与すること
・リクエスト出来るIPアドレスを制限すること
・リクエストの内容に認証エレメントをいれて、リクエストを認証すること
などの措置で、Salesforceシステムの安全性を保ちましょう。