Skip to main content
From 16:00 UTC on January 17, 2026, to 20:00 UTC on January 17, 2026, we will perform planned maintenance on the Trailhead, myTrailhead, and Trailblazer Community sites. During the maintenance, these sites will be unavailable, and users won't be able to access them. Please plan your activities around this required maintenance.

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 トリガーを定義して次のイベントを処理できます。

  • insert
  • update
  • delete
  • merge
  • upsert
  • undelete

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

Note

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 オブジェクト (取引先責任者、取引先など) によってトリガーされます。

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

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

Note

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

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

Note

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

リソース

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

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

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