Usar callouts do Apex e fluxos de trabalho com a Heroku

Objetivos de aprendizagem

Após concluir esta unidade, você estará apto a:

  • Entender como usar callouts do Apex e fluxos de trabalho com o Heroku.
  • Entender os casos de uso para callouts do Apex e fluxos de trabalho.

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.

Diagrama que mostra uma caixa com o Salesforce e um Evento de dados que é acionado ou enviado a partir de uma mensagem de saída. Uma seta sai da caixa e aponta para outra caixa contendo todos os aplicativos hospedados no Heroku

Existem dois métodos principais para se chamar um aplicativo Heroku com base em um evento no Salesforce: mensagens de saída de fluxo de trabalho ou callouts HTTP do Apex. Uma mensagem de saída de fluxo de trabalho faz uma chamada SOAP declarativamente. Um callout HTTP do Apex faz uma chamada REST a um aplicativo Heroku programaticamente. De qualquer forma, um aplicativo Heroku recebe uma solicitação com a carga de detalhes do evento e realiza a ação.

Callouts com fluxo de trabalho

Com o fluxo de trabalho, você define uma regra e um callout para um sistema externo declarativamente. A regra pode ser associada a qualquer objeto do Salesforce, como Contato ou Conta, e ser acionada com base nestes eventos de registro:

  • Criado
  • Criado e sempre que for editado
  • Criado e sempre que for editado para depois atender os critérios

As regras precisam ter critérios que filtrem os eventos. Se você não quiser filtrar nada, poderá adicionar um critério que seja sempre verdadeiro. Veja um exemplo de uma regra:

Captura de tela da caixa de diálogo Configurar regra de fluxo de trabalho, mostrando que o nome da regra deve ser Novo contato

Para chamar um aplicativo Heroku quando a regra é executada, adicione uma mensagem de saída à lista de ações de fluxo de trabalho imediatas e especifique um ponto de extremidade do aplicativo Heroku como a URL do ponto de extremidade, desta maneira:

Captura de tela da caixa de diálogo Configurar mensagem de saída, mostrando a mensagem Novo contato para Heroku

Se você selecionar Enviar ID da sessão, o aplicativo Heroku poderá usar esse token para fazer chamadas 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.

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.

Recursos