Utilisation d'appels externes Apex et d'un workflow avec Heroku

Objectifs de formation

Une fois cette unité terminée, vous pourrez :

  • Comprendre comment utiliser des appels externes Apex et un workflow avec Heroku.
  • Comprendre l'utilisation de requêtes pour des appels externes Apex et un workflow.

Appels externes vers des applications Heroku

Parfois, les événements Salesforce doivent être gérés par un système externe en raison de leur taille ou du type de processus exécuté. Par exemple, un utilisateur de Salesforce charge une image qui doit être redimensionnée pour une utilisation ultérieure. Heroku peut recevoir un événement de Salesforce et exécuter en réponse un processus. Le processus de sortie peut éventuellement être stocké dans Salesforce à l'aide des API REST ou de Heroku Connect.

Diagramme représentant un cadre avec Salesforce et un événement de données déclenché ou envoyé par un message sortant. Une flèche sort du cadre et pointe vers un autre cadre contenant toutes les applications hébergées par Heroku

Les deux principales méthodes d'appel d'une application Heroku basées sur un événement dans Salesforce sont les suivantes : messages sortants de workflow et appels externes HTTP Apex. Un message sortant de workflow effectue un appel SOAP par déclaration. Un appel externe HTTP Apex effectue un appel REST par programmation à une application Heroku. Avec les deux méthodes, l'application Heroku reçoit une requête avec la charge de travail des détails d'événement, puis exécute l'action.

Appels externes avec un workflow

Avec un workflow, vous définissez par déclaration une règle et un appel externe à un système externe. La règle peut être connectée à n'importe quel objet Salesforce, par exemple Contact ou Compte, et peut être déclenchée en fonction des événements d'enregistrement suivants :

  • Création
  • Création, puis à chaque modification
  • Création, puis à chaque modification pour remplir les critères

Les règles doivent inclure des critères qui filtrent les événements. Si vous ne souhaitez pas filtrer, vous pouvez ajouter un critère qui est toujours vrai. Voici un exemple de règle :

Capture d’écran de la boîte de dialogue de règle de configuration du workflow montrant que la règle doit être appelée Nouveau contact

Pour appeler une application Heroku lorsque la règle est exécutée, ajoutez un message sortant à la liste des actions de workflow immédiates, puis spécifiez un point de terminaison d'application Heroku en tant qu'URL de point de terminaison de terminaison, par exemple :

Capture d’écran de la boîte de dialogue de configuration de la messagerie sortante, montrant le message intitulé Nouveau contact avec Heroku

Si vous sélectionnez Send Session ID (Envoyer l’ID de session), l'application Heroku peut utiliser ce jeton pour effectuer des appels d'API REST au nom de l'utilisateur. Si vous n'envoyez pas l'ID de session, il n'est pas possible de vérifier la validité de la requête ou de protéger contre les appels malveillants au point de terminaison d'API de votre application Heroku.

Côté Heroku, vous pouvez implémenter le gestionnaire d'événements avec n'importe quelle technologie Web de source ouverte ou REST. Puisque le message se présente sous le format SOAP, vous devez analyser le XML. Par exemple, avec JavaScript, Node.js, Express et la bibliothèque express-xml-bodyparser, voici un point de terminaison qui gère un message sortant et analyse le message 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];
        }
      }); // faites quelque chose de #super avec les données et sessionId
    }
    res.status(201).end();
  }); 

Dans cet exemple, chaque fois qu'un contact est créé, l'application Heroku reçoit les détails du contact et peut traiter librement les données.

Appels externes avec des déclencheurs Apex

Vous pouvez définir des déclencheurs Apex sur des objets Salesforce pour gérer n'importe quel événement suivant :

  • insérer
  • mettre à jour
  • supprimer
  • fusionner
  • mettre à jour/insérer
  • restaurer

Le déclencheur peut utiliser un appel externe Apex pour effectuer un appel JSON REST à un point de terminaison dans l'application Heroku. Par exemple, voici un déclencheur Apex qui appelle une application Heroku :

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

La classe Apex Webhook référencée est :

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

La méthode jsonContent utilise les données du déclencheur pour les sérialiser en JSON. La méthode d'appel externe effectue la publication HTTP dans Heroku avec la charge de travail JSON.

Comme pour les messages sortants, vous pouvez construire l'application Heroku avec n'importe quelle technologie Web de source ouverte ou REST. Avec JavaScript, Node.js et Express, le point de terminaison peut être défini comme suit :

 app.post("/new_contact", function(req, res) {
  // faites quelque chose avec req.body
  res.status(201).end();
}); 

Dans le gestionnaire de requêtes, req.body correspond aux données JSON désérialisées envoyées depuis le déclencheur Apex.

Avec des déclencheurs Apex, vous pouvez utiliser une certaine forme de clé pré-partagée pour authentifier les requêtes afin d'éviter le risque de requêtes malveillantes. Vous pouvez également inclure un ID de session dans la charge de travail pour permettre à l'application Heroku d'effectuer des requêtes API REST vers Salesforce afin d'extraire ou de mettre à jour les données.

Ressources