Empiece a realizar un seguimiento de su progreso
Inicio de Trailhead
Inicio de Trailhead

Llamadas Apex SOAP

Objetivos de aprendizaje

Después de completar este módulo, podrá:
  • Generar clases de Apex con WSDL2Apex.
  • Realizar una llamada para enviar datos a un servicio externo mediante SOAP.
  • Probar llamadas mediante llamadas simuladas.

Usar WSDL2Apex para generar código Apex

Además de llamadas REST, Apex puede realizar llamadas a servicios web SOAP mediante XML. Trabajar con SOAP puede ser una experiencia difícil (pero necesaria). Afortunadamente, disponemos de herramientas para facilitar el proceso.

WSDL2Apex genera automáticamente clases de Apex a partir de un documento WSDL. Cuando descarga el archivo WSDL del servicio web y carga el WSDL, WSDL2Apex genera las clases de Apex correspondientes. Las clases de Apex crean el XML de SOAP, transmiten los datos y analizan el XML de respuesta en objetos de Apex. En lugar de desarrollar la lógica para crear y analizar el XML de los mensajes del servicio web, permita que las clases de Apex generadas por WSDL2Apex internamente controlen esta compleja estructura. Si está familiarizado con WSDL2Java o con la importación de WSDL como una referencia web en .NET, esta funcionalidad es similar a la de WSDL2Apex. Le damos la bienvenida.

Nota

Nota

Use mensajes salientes para gestionar soluciones de integración cuando sea posible. Use llamadas a servicios web de terceros solo cuando sea necesario.

En este ejemplo, vamos a usar un servicio web de calculadora sencillo para sumar dos números. Se trata de un servicio sumamente innovador. Lo primero que debemos hacer es descargar el archivo WSDL para generar las clases de Apex. Haga clic en este vínculo para descargar el archivo calculator.xml en la computadora. Recuerde la ubicación en la que guarda este archivo, ya que la necesitará en el siguiente paso.

Generar una clase de Apex a partir de WSDL

  1. En Configuración, ingrese Clases de Apex en el cuadro Búsqueda rápida y, a continuación, haga clic en Clases de Apex.
  2. Haga clic en Generar desde WSDL.
  3. Haga clic en Seleccionar archivo y seleccione el archivo calculator.xml descargado.
  4. Haga clic en Analizar WSDL. La aplicación genera un nombre de clase predeterminado para cada espacio de nombres en el documento WSDL e informa de cualquier error.

    Para este ejemplo, use el nombre de clase predeterminado. No obstante, en la vida real lo más recomendable es cambiar los nombres predeterminados para facilitar el trabajo con ellos y lograr que el código sea más intuitivo.

    Ha llegado el momento de hablar abiertamente del analizador de WSDL. El análisis de WSDL2Apex es un proceso complejo conocido por su inestabilidad. El proceso de análisis puede generar un error por varios motivos, como un tipo no compatible, múltiples enlaces o elementos desconocidos. Lamentablemente, podría verse obligado a codificar manualmente las clases de Apex que llaman al servicio web o usan HTTP.

  5. Haga clic en Generar código Apex. En la página final del asistente se muestran las clases generadas junto con los errores. La página también contiene un vínculo para ver el código generado correctamente.

Las clases de Apex generadas incluyen clases de tipo y código auxiliar para llamar al servicio web de terceros representado por el documento WSDL. Estas clases le permiten llamar al servicio web externo desde Apex. Para cada clase generada, se crea una segunda clase con el mismo nombre y el prefijo Async. La clase calculatorServices es para llamadas síncronas. La clase AsyncCalculatorServices es para llamadas asíncronas.

Ejecutar la llamada

Requisitos

Para poder ejecutar este ejemplo, autorice la dirección URL de extremo de la llamada de servicio web, https://th-apex-soap-service.herokuapp.com, mediante los pasos que se indican en la sección Autorizar direcciones de extremo.

Ya puede ejecutar la llamada y comprobar si los dos números se suman correctamente. Tenga una calculadora a mano para comprobar los resultados.

  1. Abra Developer Console desde el icono de engranaje de Configuración (Icono de engranaje).
  2. En Developer Console, seleccione Debug | Open Execute Anonymous Window (Depurar | Abrir ventana de ejecución anónima).
  3. Elimine todo el código existente e inserte el siguiente miniprograma.
    calculatorServices.CalculatorImplPort calculator = new  calculatorServices.CalculatorImplPort();
    Double x = 1.0;
    Double y = 2.0;
    Double result = calculator.doAdd(x,y);
    System.debug(result);
  4. Seleccione Open Log (Abrir registro) y, a continuación, haga clic en Execute (Ejecutar).
  5. Una vez que se abra el registro, haga clic en Debug Only (Solo depurar) para ver la salida de las declaraciones System.debug. En el registro se debe mostrar 3.0.

Probar llamadas de servicio web

Todos los desarrolladores de Apex con experiencia saben que para implementar o empaquetar código Apex, dicho código debe tener una cobertura de prueba del 75 % como mínimo. Esta cobertura incluye las clases generadas por WSDL2Apex. Es posible que ya lo sepa, pero los métodos de prueba no admiten llamadas de servicio web y las pruebas que realizan las llamadas de servicio web generan un error. Por tanto, en este caso hay algún trabajo que hacer. Con el fin de evitar que las pruebas generen un error y aumentar la cobertura de código, Apex proporciona una interfaz WebServiceMock integrada y el método Test.setMock. Puede usar esta interfaz para recibir respuestas emuladas en un método de prueba, lo que proporciona la cobertura de prueba necesaria.

Especificar una respuesta simulada para llamadas

Si crea una clase de Apex a partir de WSDL, los métodos de la clase generada automáticamente llaman a WebServiceCallout.invoke, que realiza la llamada al servicio externo. Cuando pruebe estos métodos, puede indicar al tiempo de ejecución de Apex que genere una respuesta emulada siempre que se llame a WebServiceCallout.invoke. Para ello, implemente la interfaz WebServiceMock y especifique una respuesta emulada para que el tiempo de ejecución de prueba la envíe.

Indique al tiempo de ejecución de Apex que envíe esta respuesta emulada mediante la llamada a Test.setMock en el método de prueba. Para el primer argumento, pase WebServiceMock.class. Para el segundo argumento, pase una nueva instancia de la implementación de interfaz WebServiceMock.

Test.setMock(WebServiceMock.class, new MyWebServiceMockImpl());

Dado que este proceso es complejo, vamos a examinar algunas partes del código para obtener un ejemplo completo. En este ejemplo, crea la clase que realiza la llamada (implementación simulada para pruebas) y la propia clase de prueba.

  1. En Developer Console, seleccione File | New | Apex Class (Archivo | Nuevo | Clase de Apex).
  2. Para el nombre de clase, ingrese AwesomeCalculator y, a continuación, haga clic en OK (Aceptar).
  3. Sustituya el código generado automáticamente por la siguiente definición de clase.
    public class AwesomeCalculator {
        public static Double add(Double x, Double y) {
            calculatorServices.CalculatorImplPort calculator = 
                new calculatorServices.CalculatorImplPort();
            return calculator.doAdd(x,y);
        }
    }
  4. Pulse CTRL+S para guardar.

    Cree la implementación simulada para emular la llamada durante las pruebas. La implementación de WebServiceMock llama al método doInvoke, el cual devuelve la respuesta que ha especificado para las pruebas. La mayor parte de este código es reutilizable. La parte más compleja de este ejercicio es determinar cómo el servicio web debe devolver una respuesta para que pueda emular un valor.

  5. En Developer Console, seleccione File | New | Apex Class (Archivo | Nuevo | Clase de Apex).
  6. Para el nombre de clase, ingrese CalculatorCalloutMock y, a continuación, haga clic en OK (Aceptar).
  7. Sustituya el código generado automáticamente por la siguiente definición de clase.
    @isTest
    global class CalculatorCalloutMock implements WebServiceMock {
       global void doInvoke(
               Object stub,
               Object request,
               Map<String, Object> response,
               String endpoint,
               String soapAction,
               String requestName,
               String responseNS,
               String responseName,
               String responseType) {
            // start - specify the response you want to send
            calculatorServices.doAddResponse response_x = 
                new calculatorServices.doAddResponse();
            response_x.return_x = 3.0;
            // end
            response.put('response_x', response_x); 
       }
    }
  8. Pulse CTRL+S para guardar.

    Por último, el método de prueba debe indicar al tiempo de ejecución de Apex que envíe la respuesta emulada mediante la llamada a Test.setMock antes de realizar la llamada en la clase AwesomeCalculator. Al igual que ocurre con cualquier otro método de prueba, confirmamos la recepción del resultado correcto de la respuesta simulada.

  9. En Developer Console, seleccione File | New | Apex Class (Archivo | Nuevo | Clase de Apex).
  10. Para el nombre de clase, ingrese AwesomeCalculatorTest y, a continuación, haga clic en OK (Aceptar).
  11. Sustituya el código generado automáticamente por la siguiente definición de clase.
    @isTest
    private class AwesomeCalculatorTest {
        @isTest static void testCallout() {              
            // This causes a fake response to be generated
            Test.setMock(WebServiceMock.class, new CalculatorCalloutMock());
            // Call the method that invokes a callout
            Double x = 1.0;
            Double y = 2.0;
            Double result = AwesomeCalculator.add(x, y);
            // Verify that a fake result is returned
            System.assertEquals(3.0, result); 
        }
    }
  12. Pulse CTRL+S para guardar.
  13. Para ejecutar la prueba, seleccione Test (Prueba) | Run All (Ejecutar todo).

Ahora, la clase AwesomeCalculator debe mostrar una cobertura de código del 100 %.

Recursos

Nota

Nota

Recuerde, este módulo está pensado para Salesforce Classic. Cuando inicie su organización para realizar prácticas, cambie a Salesforce Classic para completar este reto.