Erfassen Sie Ihre Fortschritte
Trailhead-Startseite
Trailhead-Startseite

Verwendung von Apex-Callouts und -Workflow mit Heroku

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Verstehen, wie Apex-Callouts und -Workflow mit Heroku verwendet werden.
  • Erläutern der Anwendungsfälle für Apex-Callouts und -Workflow.

Callouts an Heroku-Anwendungen

Manchmal müssen Ereignisse in Salesforce aufgrund des Umfangs oder Typs des ausgeführten Prozesses von einem externen System verarbeitet werden. Beispiel: Ein Benutzer in Salesforce lädt ein Bild hoch, dessen Größe für die künftige Verwendung geändert werden muss. Heroku kann ein Ereignis aus Salesforce empfangen und in Reaktion darauf einen bestimmten Prozess ausführen. Die Ausgabe des Prozesses könnte optional mittels der REST-APIs oder Heroku Connect wieder in Salesforce gespeichert werden.

Diagramm, das ein Feld mit Salesforce und einem Datenereignis zeigt, das von einer ausgehenden Nachricht ausgelöst oder gesendet wird. Ein Pfeil stammt aus dem Feld und zeigt auf ein anderes Feld, das alle Anwendungen enthält, die Heroku hostet

Es gibt zwei Hauptmethoden, eine Heroku-Anwendung auf der Basis eines Ereignisses in Salesforce aufzurufen: aus dem Workflow ausgehende Nachrichten oder Apex HTTP-Callouts. Eine aus dem Workflow ausgehende Nachricht führt einen SOAP-Aufruf deklarativ durch. Ein Apex HTTP-Callout nimmt dagegen programmgesteuert einen REST-Aufruf einer Heroku-Anwendung vor. Bei beiden Methoden empfängt die Heroku-Anwendung eine Anforderung mit der Nutzlast aus Ereignisdetails und führt dann die Aktion durch.

Callouts mit Workflow

Mit einem Workflow definieren Sie deklarativ eine Regel und einen Callout an ein externes System. Die Regel kann mit einem beliebigen Salesforce-Objekt wie 'Kontakt' oder 'Account' verbunden und auf Grundlage dieser für Datensätze geltenden Ereignisse ausgelöst werden (Regel auswerten, wenn ein Datensatz.....):

  • erstellt wird
  • erstellt wird und bei jeder Bearbeitung
  • erstellt wird, und jederzeit, wenn er bearbeitet wird, damit er bestimmten Kriterien entspricht

Regeln müssen über Kriterien verfügen, die die Ereignisse filtern. Wenn Sie keine Filter anwenden möchten, können Sie ein Kriterium hinzufügen, das immer erfüllt ist. Dies ist ein Beispiel für eine Regel:

Screenshot des Dialogfelds "Workflow-Regel konfigurieren", der zeigt, dass der Name der Regel "Neuer Kontakt" lauten sollte

Damit beim Auslösen der Regel eine Heroku-Anwendung aufgerufen wird, fügen Sie eine ausgehende Nachricht zur Liste sofortiger Workflow-Aktionen hinzu und geben einen Heroku-Anwendungsendpunkt als Endpunkt-URL an. Zum Beispiel:

Screenshot des Dialogfelds "Ausgehende Nachrichten konfigurieren" mit der Nachricht "Neuer Kontakt für Heroku"

Wenn Sie Send Session ID auswählen, kann die Heroku-Anwendung dieses Token verwenden, um REST-API-Aufrufe im Namen des Benutzers durchzuführen. Wenn Sie die Sitzungs-ID nicht senden, kann nicht geprüft werden, ob die Anforderung gültig war oder böswillige Aufrufe an den API-Endpunkt Ihrer Heroku-Anwendung erfolgen.

Heroku-seitig können Sie den Ereignishandler mit jeder Open Source-Technologie für Web oder REST implementieren. Da die Nachricht im SOAP-Format vorliegt, müssen Sie jedoch die XML analysieren können. Mit JavaScript, Node.js, Express und der Bibliothek express-xml-bodyparser haben Sie einen Endpunkt, der eine ausgehende Nachricht verarbeitet und die SOAP-Nachricht analysiert.

 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();
  }); 

In diesem Beispiel erhält die Heroku-Anwendung jedes Mal, wenn ein Kontakt erstellt wird, die Kontaktdetails und kann diese Daten ganz nach Bedarf nutzen.

Callouts mit Apex-Auslösern

Sie können Apex-Auslöser für Salesforce-Objekte definieren, um folgende Ereignisse zu behandeln:

  • insert (Einfügen)
  • update (Aktualisieren)
  • delete (Löschen)
  • merge (Zusammenführen)
  • upsert (Aktualisieren und einfügen)
  • undelete (Löschen rückgängig)

Der Auslöser kann einen Apex-Callout nutzen, um einen REST JSON-Aufruf an einen Endpunkt in einer Heroku-Anwendung abzusetzen. Das folgende Beispiel zeigt einen Apex-Auslöser, der eine Heroku-Anwendung aufruft:

 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);
} 

Die referenzierte Webhook Apex-Klasse lautet wie folgt:

 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);
  }
} 

Die jsonContent-Methode nimmt die Auslöserdaten und serialisiert sie in JSON. Die callout-Methode führt den HTTP Post zu Heroku mit der JSON-Nutzlast durch.

Wie bei ausgehenden Nachrichten können Sie die Heroku-Anwendung mit jeder Open Source-Technologie für Web oder REST erstellen. Bei Verwendung von JavaScript, Node.js und Express könnte der Endpunkt definiert werden als:

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

Im Anforderungshandler stellt 'req.body' die deserialisierten JSON-Daten dar, die der Apex-Auslöser sendet.

Bei Apex-Auslösern können Sie eine Art vorab freigegebenen Schlüssel verwenden, um Anforderungen zu authentifizieren und dadurch das Risiko böswilliger Anforderungen zu vermeiden. Sie können außerdem festlegen, dass die Nutzlast eine Sitzungs-ID beinhalten muss, damit die Heroku-Anwendung REST-API-Anforderungen an Salesforce stellen darf, um Daten abzurufen oder zu ändern.

Ressourcen