trailhead

学習の目的

この単元を完了すると、次のことができるようになります。

  • Heroku で Apex コールアウトとワークフローを使用する方法を理解する。
  • Apex コールアウトとワークフローの使用事例を理解する。

Heroku アプリケーションへのコールアウト

実行するプロセスのスケールまたは種別のために Salesforce の行動を外部システムで処理しなければならない場合があります。たとえば、今後の使用のためにサイズ変更が必要な画像を Salesforce のユーザがアップロードします。Heroku は Salesforce から行動を受け取って、何らかのプロセスを実行し、応答することができます。また、REST API や Heroku Connect を使用してプロセスの出力を Salesforce に戻して保存することもできます。

画像の代替テキスト

Salesforce の行動に基づいて Heroku アプリケーションをコールするための主な方法が 2 つあります。ワークフローアウトバウンドメッセージを使用する方法と Apex HTTP コールアウトを使用する方法です。ワークフローアウトバウンドメッセージは SOAP コールを宣言的に実行します。Apex HTTP コールアウトは Heroku アプリケーションへの REST コールをプログラムで実行します。どちらの方法でも、Heroku アプリケーションは、行動の詳細のペイロードと共に要求を受け取ってアクションを実行します。

ワークフローの概要についてさらに詳しく学習するには、Trailhead の単元「ワークフローを使用した時間ベースのアクションの自動化」を参照してください。

ワークフローを使用したコールアウト

ワークフローを使用する場合、ルールと、外部システムへのコールアウトを宣言的に定義します。ルールは任意の Salesforce オブジェクト (取引先責任者、取引先など) に接続でき、次のレコード行動に基づいてトリガできます。

  • 作成されたとき
  • 作成されたとき、および編集されるたび
  • 作成されたとき、およびその後基準を満たすように編集されたとき

ルールには、行動を絞り込む条件が必要です。絞り込みを行わない場合、常に true である条件を追加できます。ルールの例を次に示します。

画像の代替テキスト

ルールの実行時に Heroku アプリケーションをコールするには、アウトバウンドメッセージをルール適用時のアクションのリストに追加して、Heroku アプリケーションエンドポイントを次のようなエンドポイント URL として指定します。

画像の代替テキスト

Send Session ID を選択した場合、Heroku アプリケーションはそのトークンを使用して REST API コールをユーザに代わって実行できます。セッション ID を送信しない場合、要求が有効であることを確認できません。また、Heroku アプリケーションの API エンドポイントへの悪意のあるコールから保護できません。

Heroku 側では、オープンソースの Web または REST 技術を使用してイベントハンドラを実装できます。ただし、メッセージは SOAP 形式のため、XML を解析できる必要があります。たとえば、JavaScript、Node.js、Express、および express-xml-bodyparser ライブラリを使用する場合、アウトバウンドメッセージを処理し、SOAP メッセージを解析するエンドポイントは次のようになります。

app.post("/new_contact", function(req, res) { var notification = req.body["soapenv:envelope"]["soapenv:body"][0]["notifications"][0]; var sessionId = notification["sessionid"][0]; var data = {}; if (notification["notification"] !== undefined) { var sobject = notification["notification"][0]["sobject"][0]; Object.keys(sobject).forEach(function(key) { if (key.indexOf("sf:") == 0) { var newKey = key.substr(3); data[newKey] = sobject[key][0]; } }); // do something #awesome with the data and sessionId } res.status(201).end(); }); 

この例では、取引先責任者を作成するたびに Heroku アプリケーションは取引先責任者の詳細を受け取るため、そのデータを使用して必要な処理を実行できます。

Apex トリガを使用したコールアウト

Salesforce オブジェクトの Apex トリガを定義して次のイベントを処理できます。

  • 挿入
  • 更新
  • 削除
  • マージ
  • 更新/挿入
  • 復元

トリガは、Apex コールアウトを使用して Heroku アプリケーションのエンドポイントへの REST JSON コールを実行できます。たとえば、Heroku アプリケーションをコールする Apex トリガを次に示します。

trigger NewContactWebhookTrigger on Contact (after insert) { String url = 'https://foo.herokuapp.com/new_contact'; String content = Webhook.jsonContent(Trigger.new, Trigger.old); Webhook.callout(url, content); } 

参照される Webhook Apex クラスは次のとおりです。

public class Webhook { public static String jsonContent(List<Object> triggerNew, List<Object> triggerOld) { String newObjects = '[]'; if (triggerNew != null) { newObjects = JSON.serialize(triggerNew); } String oldObjects = '[]'; if (triggerOld != null) { oldObjects = JSON.serialize(triggerOld); } String userId = JSON.serialize(UserInfo.getUserId()); String content = '{"new": ' + newObjects + ', "old": ' + oldObjects + ', "userId": ' + userId + '}'; return content; } @future(callout=true) public static void callout(String url, String content) { Http h = new Http(); HttpRequest req = new HttpRequest(); req.setEndpoint(url); req.setMethod('POST'); req.setHeader('Content-Type', 'application/json'); req.setBody(content); h.send(req); } } 

jsonContent メソッドはトリガデータを取得して JSON に逐次化します。コールアウトメソッドは JSON ペイロードを使用して Heroku への HTTP ポストを実行します。

アウトバウンドメッセージの場合と同様に、オープンソースの Web または REST 技術を使用して Heroku アプリケーションを構築できます。JavaScript、Node.js、および Express では、エンドポイントを次のように定義できます。

app.post("/new_contact", function(req, res) { // do something with req.body res.status(201).end(); }); 

要求ハンドラ内の req.body は、Apex トリガから送信された、並列化された JSON データです。

Apex トリガを使用する場合、何らかの形式の事前共有キーを使用して要求を認証できるため、悪意のある可能性がある要求を回避できます。また、ペイロードにセッション ID を含めて、Heroku アプリケーションで Salesforce への REST API 要求を実行し、データを取得または更新することもできます。

リソース

retargeting