Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .
El enlace a la publicación original, lo encontrarás al final de este artículo.
…
Los desarrolladores de Apex tienen acceso a una gran cantidad de recursos que pueden ayudarlos a mejorar la calidad de su desarrollo. Pueden obtener información sobre las nuevas funciones de Trailhead . Pueden ver ejemplos de prácticas recomendadas en Recetas de Apex . Pueden colaborar en Trailblazer Community y Salesforce Stack Exchange .
Pero hay un recurso que ha estado faltando hasta ahora. La cantidad de paquetes de código abierto disponibles en el espacio de Salesforce es limitada en comparación con Java, JavaScript o Python. Piense en los paquetes disponibles a través de npm o Maven Central. Bueno, hay buenas noticias: ¡nuestra situación ha mejorado! Los desarrolladores ahora pueden usar estos paquetes dentro del código Apex con la introducción de las funciones de Salesforce .
Salesforce Functions le permite ejecutar código Java o JavaScript desde Apex. Este código se ejecuta en un entorno informático elástico administrado por Salesforce, lo que permite a los desarrolladores centrarse en la calidad del código en lugar de la infraestructura o la integración.
Este artículo le dará una descripción general de cómo configurar esto. Usaremos el ejemplo de una biblioteca Java para un estándar de seguridad web que sería difícil de implementar en Apex. Esto lleva solo un par de horas con las funciones de Salesforce, mientras que implementar la misma lógica en Apex llevaría muchos días, si no semanas.
Preparando la escena
Preparemos la escena antes de sumergirnos en los aspectos técnicos. Imagine que somos un cliente que ha estado desarrollando software durante mucho tiempo. Hemos creado un conjunto de aplicaciones Java con una capa de servicios web para comunicarnos con otros sistemas dentro de nuestro entorno.
Uno de estos puntos finales es un servicio web SOAP al que debemos llamar desde Salesforce. El servicio web requiere que protejamos nuestros mensajes utilizando un estándar muy conocido: WS-Security . Si bien Apex admite llamar a un punto final de WS-Security, requiere que manipulemos el mensaje SOAP saliente. Podemos hacer esto usando la biblioteca Crypto para cambiar el XML, pero luego nos encontramos rápidamente con situaciones complejas. Después de prueba y error, está claro que necesitamos otra solución.
Podríamos aprovechar una solución de integración como MuleSoft para transformar nuestro mensaje. O podríamos cambiar la lógica del servicio web para implementar un estándar de seguridad que sea más compatible con Apex. Tales soluciones no siempre están disponibles o son deseables. En su lugar, abordaremos el problema utilizando las funciones de Salesforce.
Una buena taza de Java
Conectarse a puntos finales habilitados para WS-Security es pan comido en Java. Primero, importamos el paquete Apache WSS4J . Contiene una biblioteca Java que implementa el estándar WS-Security. A continuación, escribimos un pequeño método Java que toma nuestro mensaje SOAP como entrada. Este método usa WSS4J para firmar el mensaje y luego devuelve el resultado.
Puede encontrar el método a continuación. Se omiten algunos detalles de seguridad, pero puede encontrar la clase completa en GitHub . Primero convertimos el mensaje SOAP en un objeto Documento. Luego usamos WSS4J para crear el encabezado de seguridad, la marca de tiempo y finalmente la firma. Finalizamos el método agregando todo al objeto Documento y devolviéndolo como una Cadena.
Necesitamos envolver el método de firma en una agradable y acogedora manta de funciones de Salesforce. Esto nos permite llamar al método de firma desde Apex. Implementamos la clase SalesforceFunction
y anulamos el método de apply
.
<dx-code-block title language code-block="public class WssecurityjavaFunction implements SalesforceFunction { […] @Override public FunctionOutput apply(InvocationEvent event, Context context) throws Exception { // Retrieve Function input String soapMessageToSign = event.getData().getXmlBody(); // Pass to signing method String signedSoapMessage = this.signSoapMessage(soapMessageToSign); // Return the output (this is what Apex will receive) return new FunctionOutput(signedSoapMessage); } […]
}»>
¡Y eso es todo por la parte de Java de nuestra implementación! Dejaremos la creación de la prueba unitaria fuera del alcance de este artículo. Ahora estamos listos para implementar todo en Salesforce.
Desplegando la función
Necesitamos ocuparnos de un par de cosas antes de que podamos implementar nuestra función. No repasaremos estos pasos en detalle, ya que se describen en las guías de funciones de Salesforce vinculadas con cada elemento.
- Asegúrese de tener acceso a una organización de Salesforce donde las Funciones de Salesforce estén habilitadas. Esto se puede hacer poniéndose en contacto con su ejecutivo de cuenta de Salesforce (AE) y solicitando probar aplicaciones de muestra como la de este artículo, Combinación de cuentas o Generación de PDF .
- Configure un entorno de desarrollo y conéctelo a su organización de Salesforce. Cree un entorno informático vinculado a una sandbox o a una organización borrador de esa organización.
- Agregue el proyecto de Salesforce DX que contiene la función a Git .
Una vez que hayamos hecho eso, podemos ejecutar el siguiente comando para implementar. Después de un tiempo, el comando se completará. ¡Ya estamos listos para llamar a nuestra función desde Apex!
Llamar desde Apex
La forma más sencilla de llamar a la función desde Apex es ejecutando el código de forma anónima desde VS Code (o Developer Console, si quiere volver a la vieja escuela). A continuación puede encontrar un ejemplo simplificado ( script completo ).
<dx-code-block title language code-block="// Instantiate Function through name reference
Functions.Function securityFunc = Functions.Function.get('functionswssecurity.wssecurityjava'); // Hardcoded input for educational purposes
String jsonInput = '{ "xmlBody" : "…" }’; // Invoke the Function and retrieve and deserialize response
Functions.FunctionInvocation invocation = securityFunc.invoke(jsonInput);
String jsonResponse = invocation.getResponse();
Map xmlResponse = (Map) JSON.deserializeUntyped(jsonResponse); // Print out the signed SOAP message
System.debug(‘Xml retrieved: ‘ + xmlResponse.get(‘signedSoapMessage’));»>
Cuando ejecutamos este código, aparece un hermoso mensaje SOAP firmado del que puede estar orgulloso. ¡Ahora podemos enviar al punto final de WS-Security!
Conclusión
A lo largo de este artículo, vimos cómo las funciones de Salesforce pueden empoderar a los desarrolladores de Apex. Podemos desbloquear bibliotecas y paquetes de otros lenguajes de programación. ¡Esto trae infinitas nuevas posibilidades a la plataforma!
Vimos un ejemplo específico: el paquete WSS4J. Nos permitió transformar un mensaje SOAP con un par de líneas de código Java. Se accedió fácilmente a la salida en Apex, donde pudimos continuar procesando.
Esta es una herramienta nueva y poderosa en nuestro cinturón de herramientas. A primera vista, parece servir para casos de uso muy específicos. Al mirar más profundamente, vemos que obtener acceso a una amplia gama de bibliotecas de códigos puede beneficiarnos de muchas maneras. Deje que lo inspire a echar también un vistazo a las funciones de Salesforce con una nueva perspectiva.
Sobre el Autor
Nicolas Vanden Bossche es arquitecto sénior de programas en Salesforce y arquitecto técnico certificado (CTA). Tiene más de 9 años de experiencia en entrega y consultoría técnica en el ecosistema de Salesforce en plataformas, ventas, servicios, marketing y comercio. Le apasiona ayudar a las personas a superar sus desafíos para que puedan concentrarse en lo que más les importa.
Obtenga las últimas publicaciones de blog de desarrolladores de Salesforce y episodios de podcast a través de Slack o RSS.
Agregar a Slack Suscríbete a RSS
…
Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2022/10/do-the-impossible-in-apex-with-salesforce-functions.html