Usar callouts do Apex e mensagens de saída com a Heroku
Objetivos de aprendizagem
Após concluir esta unidade, você estará apto a:
- Enviar callouts do Apex e mensagens de saída para a Heroku.
- Discutir os casos de uso para callouts do Apex e mensagens de saída.
Callouts para aplicativos Heroku
Às vezes, os eventos no Salesforce precisam ser tratados por um sistema externo devido ao tamanho ou ao tipo de processo em execução. Por exemplo, um usuário no Salesforce carrega uma imagem que precisa ser redimensionada para uso futuro. A Heroku pode receber um evento do Salesforce e realizar alguns processos em resposta. Como opção, o resultado do processo pode ser armazenado no Salesforce usando as APIs REST ou o Heroku Connect.
Existem vários métodos para se chamar um aplicativo Heroku com base em um evento no Salesforce: callouts HTTP do Apex, mensagens de saída ou ações HTTP no Flow. Um callout HTTP do Apex faz uma chamada REST a um aplicativo Heroku programaticamente. Uma mensagem de saída é uma ação que realiza uma chamada SOAP de forma declarativa. De qualquer forma, um aplicativo Heroku recebe uma solicitação com a carga de detalhes do evento e realiza a ação.
Acesse as postagens de blog Swagger / OpenAPI + Salesforce = LIKE e Integrações com API simplificadas com serviços externos para obter informações sobre ações HTTP no Flow e em serviços externos.
Callouts com acionadores do Apex
Você pode definir acionadores do Apex em objetos do Salesforce para lidar com qualquer um destes eventos:
- insert
- update
- delete
- merge
- upsert
- undelete
O acionador pode usar um callout do Apex para fazer uma chamada JSON REST a um ponto de extremidade em um aplicativo Heroku. Por exemplo, veja um acionador do Apex que chama um aplicativo 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); }
A classe do Apex Webhook referenciada é:
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); } }
O método jsonContent usa os dados do acionador e os serializa para JSON. O método callout faz a solicitação HTTP para o Heroku com a carga JSON.
Assim como no caso das mensagens de saída, você pode criar o aplicativo Heroku com qualquer tecnologia REST ou Web de código aberto. Com JavaScript, Node.js e Express, o ponto de extremidade pode ser definido como:
app.post("/new_contact", function(req, res) { // do something with req.body res.status(201).end(); });
No manipulador de solicitações, o corpo da solicitação é composto de dados JSON desserializados enviados do acionador do Apex.
Com os acionadores do Apex, você pode usar um tipo de chave pré-compartilhada para autenticar solicitações, evitando a possibilidade de solicitações mal-intencionadas. Você também pode fazer com que a carga inclua uma ID de sessão para permitir que o aplicativo Heroku faça solicitações pela API REST ao Salesforce para buscar ou atualizar dados.
Callouts com mensagens de saída
Com as ações de Mensagem de saída, você define de forma declarativa um callout para um sistema externo e um fluxo acionado por registro para enviar o callout.
Para fazer a chamada de um aplicativo Heroku quando o fluxo for executado, primeiro crie uma ação de Mensagem de saída. Especifique um ponto de extremidade do aplicativo Heroku como a URL do ponto de extremidade.
Se você selecionar Send Session ID
(Enviar ID da sessão), o aplicativo Heroku poderá usar esse token para fazer chamadas de API REST em nome do usuário. Se você não enviar a ID da sessão, não há como verificar se a solicitação é válida ou de se proteger de chamadas mal-intencionadas para o ponto de extremidade da API de seu aplicativo Heroku.
No lado da Heroku, você pode implantar um manipulador de eventos com qualquer tecnologia REST ou Web de código aberto. Mas como a mensagem está em formato SOAP, você precisará ser capaz de analisar o XML. Por exemplo, com JavaScript, Node.js, Express e a biblioteca express-xml-bodyparser, temos um ponto de extremidade que lida com uma mensagem de saída e analisa a mensagem 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(); });
Neste exemplo, cada vez que um contato é criado, o aplicativo Heroku recebe os detalhes do contato e pode fazer o que quiser com os dados.
Depois de criar a ação de Mensagem de saída, crie o fluxo que a chama. O fluxo pode ser acionado por qualquer objeto do Salesforce, como Contato ou Conta, quando ocorrer uma das seguintes situações:
- Um registro é criado
- Um registro é atualizado
- Um registro é criado ou atualizado
- Um registro é excluído
Se você acionar o fluxo quando um registro for atualizado, poderá especificar se o fluxo deve ser acionado sempre que o registro for atualizado e atender aos requisitos de condição, ou se ele deve ser acionado somente quando o registro for atualizado para atender aos requisitos de condição.
Depois de configurar o elemento de início do fluxo, crie um elemento de Ação. No campo Ação, insira a ação de Mensagem de saída que você criou. Em seguida, dê ao elemento um Rótulo, clique em Concluído e salve seu fluxo. Quando o fluxo executa esse elemento, ele envia o callout definido na ação de Mensagem de saída.
Recursos
-
Guia do desenvolvedor da API SOAP: Setting Up Outbound Messaging
-
Ajuda do Salesforce: Ações de mensagem de saída
-
Ajuda do Salesforce: Elemento do fluxo: Pausar
-
Guia do desenvolvedor do Apex: Invoking HTTP Callouts
-
Trailhead: Introdução ao Node.js no Heroku
-
JAMES WARD: Quick Start to Node.js on Heroku