Utilisation d’appels externes Apex et de messages sortants avec Heroku
Objectifs de formation
Une fois cette unité terminée, vous pourrez :
- Envoyer des appels externes Apex et des messages sortants à Heroku
- Évoquer des cas d’utilisation des appels Apex et des messages sortants
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.
Il existe plusieurs méthodes pour appeler une application Heroku reposant sur un événement dans Salesforce : Appels HTTP Apex, messages sortants ou actions HTTP dans Flow (Flux). Un appel externe HTTP Apex effectue un appel REST par programmation à une application Heroku. Un message sortant est une action qui effectue un appel SOAP par déclaration. 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.
Consultez les publications Swagger / OpenAPI + Salesforce = LIKE et Intégrations d’API simplifiées à des services externes sur le blog pour obtenir plus d’informations sur les actions HTTP dans Flow (Flux) et les services externes.
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) { // do something with 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.
Appels externes avec messages sortants
Avec les actions Message sortant, vous définissez un appel par déclaration vers un système externe ainsi qu’un flux déclenché par enregistrement pour envoyer l’appel externe.
Pour appeler une application Heroku lors de l’exécution du flux, créez d’abord une action Message sortant. Indiquez un point de terminaison d’application Heroku comme URL de point de terminaison.
Si vous sélectionnez Envoyer un 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 d’appliquer de protection 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]; } }); // do something #awesome with the data and 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.
Après avoir créé l’action Message sortant, créez le flux qui l’appelle. Le flux peut être déclenché par n’importe quel objet Salesforce, tel qu’un contact ou un compte, lorsque l’un des événements suivants se produit :
- Un enregistrement est créé
- Un enregistrement est modifié
- Un enregistrement est créé ou mis à jour
- Un enregistrement est supprimé
Si vous déclenchez le flux lorsqu’un enregistrement est mis à jour, vous pouvez spécifier si le flux doit se déclencher chaque fois que l’enregistrement est mis à jour et répond aux exigences de conditions, ou uniquement lorsque l’enregistrement est mis à jour pour répondre aux exigences de conditions.
Après avoir configuré l’élément de début du flux, créez un élément Action. Dans le champ Action, entrez l’action Message sortant que vous avez créée. Attribuez ensuite une étiquette à l’élément, cliquez sur Terminé et enregistrez votre flux. Lorsque le flux exécute cet élément, il envoie l’appel externe défini dans l’action Message sortant.
Ressources
-
Guide du développeur d’API SOAP : Setting Up Outbound Messaging
-
Aide Salesforce : Actions de messages sortants
-
Aide Salesforce : Élément de flux : Interruption
-
Guide du développeur Apex : Invoking HTTP Callouts
-
Trailhead : Introduction à Node.js sur Heroku
-
JAMES WARD : Quick Start to Node.js on Heroku