Skip to main content

Heroku で Apex コールアウトとワークフローを使用する

学習の目的

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

  • Apex コールアウトとアウトバウンドメッセージを Heroku に送信する。
  • Apex コールアウトとアウトバウンドメッセージのユースケースを検討する。

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

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

アウトバウンドメッセージからトリガーされたか送信された Salesforce とデータイベントを含むボックスを示す図。ボックスからの矢印と Heroku でホストされるすべてのアプリケーションを含む別のボックスへの参照

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

フローの HTTP アクションや外部サービスについての詳細は、「Swagger / OpenAPI + Salesforce = LIKE (Swagger / OpenAPI + Salesforce = いいね!)」「Simplified API Integrations with External Services (外部サービスとの API インテグレーションの簡素化)」ブログ投稿を参照してください。

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 要求を実行し、データを取得または更新することもできます。

メモ

Apex コールアウトについての詳細は、「Apex を使用したコールアウトの呼び出し」を参照してください。外部サービスとの Apex インテグレーションについての詳細は、Heroku の「API に対して Apex とワークフローのコールアウトを行う」ドキュメントを参照してください。

アウトバウンドメッセージを使用したコールアウト

アウトバウンドメッセージアクションを使用する場合は、外部システムへのコールアウトと、コールアウトを送信するレコードトリガーフローを宣言的に定義します。

フローの実行時に Heroku アプリケーションをコールするには、まずアウトバウンドメッセージアクションを作成します。Heroku アプリケーションエンドポイントをエンドポイント URL に指定します。

[アウトバウンドメッセージの設定] ダイアログのスクリーンショット。「Heroku への新規取引先責任者」という名前のメッセージが表示されています。

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 アプリケーションは取引先責任者の詳細を受け取るため、そのデータを使用して必要な処理を実行できます。

アウトバウンドメッセージアクションを作成したら、コールするフローを作成します。このフローは、次のいずれかが発生したときに任意の Salesforce オブジェクト (取引先責任者、取引先など) によってトリガーされます。

  • レコードが作成されたとき
  • レコードが更新されたとき
  • レコードが作成または更新されたとき
  • レコードが削除されたとき

レコードが更新されたときにフローをトリガーする場合は、レコードが更新され、かつ条件の要件を満たしている場合は必ずフローをトリガーするか、レコードが更新されて条件の要件を満たしたときにのみトリガーするかを指定できます。

メモ

レコードトリガーフローで、フローをトリガーするレコードを制限するエントリ条件を設定できます。この機能を使用して、レコードがコールアウトを送信する条件を指定します。

フローの開始要素を設定した後に、アクション要素を作成します。[アクション] 項目に、作成したアウトバウンドメッセージアクションを入力します。次に、要素に表示ラベルを付け、[完了] をクリックしてフローを保存します。フローでこの要素が実行されると、アウトバウンドメッセージアクションで定義されたコールアウトが送信されます。

メモ

フローで Heroku からの応答を待機することもできます。詳細は、Salesforce ヘルプの「フロー要素: 一時停止」を参照してください。

リソース

Salesforce ヘルプで Trailhead のフィードバックを共有してください。

Trailhead についての感想をお聞かせください。[Salesforce ヘルプ] サイトから新しいフィードバックフォームにいつでもアクセスできるようになりました。

詳細はこちら フィードバックの共有に進む