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 esta sub-lección
- 01Distinguir REST de SOAP y saber cuándo te tocará cada uno.
- 02Generar clases de Apex a partir de un WSDL y usarlas.
- 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.
| REST | SOAP | |
|---|---|---|
| Formato | JSON, normalmente | XML, siempre, dentro de un «sobre» |
| Contrato | Documentación; a veces OpenAPI | El WSDL: operaciones y tipos, obligatorio |
| Cómo se llama | Verbos y direcciones (GET /renewals/…) | Operaciones con nombre (createInvoice) |
| En Apex | Http, HttpRequest, JSON | Clases 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.
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 WSDLLO 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 nutria: ¿Y por qué no un Flow? Porque Flow no habla SOAP