Apex Academy
Módulo 11·05·25 min

SOAP y WSDL2Apex

Muchos sistemas veteranos hablan SOAP: mensajes en XML con un contrato estricto, el WSDL. No lo escribes a mano: Salesforce lee el WSDL y genera clases de Apex que llamas como cualquier otro método.

En Admin esUn formulario oficial con casillas fijas, frente a una nota libre

✓ En esta sub-lección

  1. 01Distinguir REST de SOAP y saber cuándo te tocará cada uno.
  2. 02Generar clases de Apex a partir de un WSDL y usarlas.
  3. 03Tratar el fallo de un callout SOAP.

La nutria: ¿Te acuerdas? · Repaso de la lección 4

¿Qué anotación publica una clase de Apex como servicio REST?

Northwind factura con un sistema de hace quince años. No tiene una API REST ni habla JSON: habla SOAP. Cuando una renovación se cierra, hay que pedirle una factura. Lo primero que te manda su equipo no es documentación, es un archivo: el WSDL.

RESTSOAP
FormatoJSON, normalmenteXML, siempre, dentro de un «sobre»
ContratoDocumentación; a veces OpenAPIEl WSDL: operaciones y tipos, obligatorio
Cómo se llamaVerbos y direcciones (GET /renewals/…)Operaciones con nombre (createInvoice)
En ApexHttp, HttpRequest, JSONClases generadas con WSDL2Apex

WSDL2Apex: que el XML lo escriba Salesforce

En Setup → Apex Classes hay un botón, Generate from WSDL. Subes el archivo y Salesforce genera clases de Apex: una por cada tipo de dato y una clase «puerto» con un método por cada operación del servicio. Esas clases montan el sobre XML, lo envían y convierten la respuesta. Tú solo creas el puerto y llamas al método.

Apex
InvoiceService.InvoicePort port = new InvoiceService.InvoicePort();   // el puerto generado
port.endpoint_x = 'callout:Invoicing/soap/invoices';                 // a dónde (Named Credential)
port.timeout_x = 20000;                                              // cuánto esperar
String invoiceId = port.createInvoice('ERP-100', 12500.00);          // la operación del WSDL
Los atributos que terminan en _x son los ajustes de la llamada que añade el generador. createInvoice parece un método normal, pero por dentro es un callout, con todas sus reglas.

LO QUE VIAJA POR EL CABLE

POST /invoices
Content-Type: application/json

{"erpCode":"ERP-100","amount":12500.00}

LO QUE ESCRIBES TÚ

HttpRequest req = new HttpRequest();
req.setEndpoint('callout:Invoicing/invoices');
req.setMethod('POST');
req.setBody(JSON.serialize(row));
HttpResponse res = new Http().send(req);

En REST montas la petición a mano: verbo, dirección y un cuerpo en JSON.

La misma petición en REST y en SOAP: qué viaja por el cable y qué escribes tú en Apex.

La nutria: ¿Y por qué no un Flow? Porque Flow no habla SOAP

Este sí es un límite claro. Las herramientas de clics para llamar fuera, External Services y la acción HTTP Callout, trabajan con APIs REST descritas en OpenAPI: un servicio SOAP con su WSDL no se puede registrar ahí. Para el sistema de facturación, el único camino es Apex: generar las clases con WSDL2Apex y, si quieres usarlas desde un flow, envolverlas en una acción invocable.