Skip to main content

Utilizar Mensajes salientes y llamadas de Apex con Heroku

Objetivos de aprendizaje

Después de completar esta unidad, podrá:

  • Enviar mensajes salientes y llamadas de Apex a Heroku.
  • Debatir sobre los casos de uso para los mensajes salientes y las llamadas de Apex.

Llamadas a aplicaciones Heroku

A veces los eventos en Salesforce tienen que controlarse a través de un sistema externo debido a la escala o el tipo de proceso que se está ejecutando. Por ejemplo, un usuario en Salesforce carga una imagen a la que hay que cambiar el tamaño para un uso futuro. Heroku puede recibir un evento desde Salesforce y realizar algún proceso como respuesta. Opcionalmente, el resultado del proceso podría almacenarse de vuelta en Salesforce utilizando las API de REST o Heroku Connect.

Diagrama mostrando un cuadro con Salesforce y un Evento de datos desencadenado o enviado desde un mensaje saliente. Una flecha sale del cuadro y apunta a otro cuadro que contiene todas las aplicaciones que alberga Heroku.

Existen varios métodos para llamar a una aplicación Heroku en función de un evento en Salesforce: llamadas HTTP de Apex, mensajes salientes o acciones HTTP en Flow. Una llamada HTTP de Apex realiza programáticamente una llamada REST a una aplicación Heroku. Un mensaje saliente es una acción que realiza una llamada de SOAP de forma declarativa. De cualquiera de las maneras, la aplicación Heroku recibe una solicitud con la carga de los detalles del evento y luego realiza la acción.

Visite las publicaciones de blog Swagger/OpenAPI + Salesforce = LIKE e Integraciones simplificadas de API con servicios externos para obtener información sobre las acciones HTTP en Flow y los servicios externos.

Llamadas con desencadenadores de Apex

Puede definir desencadenadores de Apex en objetos de Salesforce para controlar cualquiera de estos eventos:

  • insert
  • update
  • delete
  • merge
  • upsert
  • undelete

El desencadenador puede utilizar una llamada de Apex para realizar una llamada JSON de REST a un extremo en una aplicación Heroku. Por ejemplo, a continuación se muestra un desencadenador de Apex que llama a una aplicación 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 clase de Apex Webhook a la que se hace referencia es:

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

  }

} 

El método jsonContent toma los datos del desencadenador y los serializa en JSON. El método de llamada realiza la publicación HTTP en Heroku con la carga JSON.

Como con los mensajes salientes, puede construir la aplicación Heroku con cualquier tecnología REST o de código abierto web. Con JavaScript, Node.js y Express, el extremo podría definirse como:

 app.post("/new_contact", function(req, res) {

  // do something with req.body

  res.status(201).end();

});

En el controlador de solicitudes, req.body son los datos JSON deserializados enviados desde el desencadenador de Apex.

Con los desencadenadores de Apex puede utilizar algún tipo de clave precompartida que autentique las solicitudes, evitando la posibilidad de que se produzcan solicitudes malintencionadas. También puede hacer que la carga incluya un Id. de sesión que permite a la aplicación Heroku realizar solicitudes de API de REST de vuelta en Salesforce para obtener o actualizar datos.

Nota

Para obtener más información sobre las llamadas de Apex, consulte la documentación de Salesforce Invocar llamadas con Apex. Visite la documentación de Heroku Hacer llamadas de Apex y de flujos de trabajo a la API para obtener más información sobre la integración de Apex con un servicio externo.

Llamadas con mensajes salientes

Con las acciones de mensaje saliente, se define de forma declarativa una llamada a un sistema externo y un flujo desencadenado por registros para enviar la llamada.

Para llamar a una aplicación de Heroku cuando se ejecute el flujo, cree primero una acción Mensaje saliente. Especifique un extremo de la aplicación Heroku como la URL de extremo.

Captura de pantalla del cuadro de diálogo Configurar mensajería saliente, mostrando el mensaje denominado Nuevo contacto en Heroku

Si selecciona Send Session ID (Enviar Id. de sesión), la aplicación de Heroku puede utilizar ese token para realizar llamadas a la API de REST en nombre del usuario. Si no envía el Id. de sesión no habrá forma de comprobar que la solicitud era válida ni de protegerse ante llamadas malintencionadas al extremo de API de su aplicación de Heroku.

En el lado de Heroku, puede implementar el controlador de eventos con cualquier tecnología REST o de código abierto web. Pero debido a que el mensaje está en formato SOAP, es necesario que pueda analizar el XML. Por ejemplo, con JavaScript, Node.js, Express y la biblioteca express-xml-bodyparser, hay un extremo que controla un mensaje saliente y analiza el mensaje 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(); });

En este ejemplo, cada vez que se crea un contacto, la aplicación Heroku recibe los detalles del contacto y puede hacer lo que sea necesario con los datos.

Después de crear la acción Mensaje saliente, cree el flujo que la llama. El flujo se puede desencadenar mediante cualquier objeto de Salesforce, como Contacto o Cuenta, cuando se produce una de las siguientes situaciones:

  • se crea un registro;
  • se actualiza un registro;
  • se crea o se actualiza un registro;
  • se elimina un registro.

Si desencadena el flujo cuando se actualiza un registro, puede especificar si el flujo debe desencadenarse cada vez que el registro se actualiza y cumple los requisitos de condición, o si debe desencadenarse solo cuando el registro se actualiza para cumplir los requisitos de condición.

Nota

En los flujos desencadenados por registros, puede establecer condiciones de entrada que limiten qué registros desencadenan el flujo. Utilice esta función para especificar los criterios según los que los registros envían la llamada.

Después de configurar el elemento inicial del flujo, cree un elemento Acción. En el campo Acción, introduzca la acción Mensaje saliente que creó. A continuación, asigne una Etiqueta al elemento, haga clic en Listo y guarde el flujo. Cuando el flujo ejecuta este elemento, envía la llamada definida en la acción Mensaje saliente.

Nota

Los flujos también pueden esperar una respuesta de Heroku. Para obtener más información, consulte Elemento de flujo: Realizar pausa en la Ayuda de Salesforce.

Recursos

Comparta sus comentarios de Trailhead en la Ayuda de Salesforce.

Nos encantaría saber más sobre su experiencia con Trailhead. Ahora puede acceder al nuevo formulario de comentarios en cualquier momento en el sitio de Ayuda de Salesforce.

Más información Continuar a Compartir comentarios