XML en APIs y Web Services (ejemplo SOAP)

1. APIs y Web Services: contexto

Una API (Application Programming Interface) es un conjunto de reglas que permite que dos aplicaciones se comuniquen.

Un Web Service es una API que usa protocolos de internet (como HTTP, SMTP, etc.) para intercambio de información.

Durante muchos años, el formato más común de intercambio fue XML, especialmente en servicios basados en SOAP.

Hoy en día JSON es más usado en APIs REST, pero en entornos bancarios, gubernamentales y empresariales todavía SOAP con XML sigue vigente.

2. ¿Qué es SOAP?

SOAP (Simple Object Access Protocol) es un protocolo basado en XML que define cómo enviar mensajes estructurados entre sistemas.

  • Usa XML como formato de datos.
  • Usa HTTP (o SMTP) como protocolo de transporte.

Cada mensaje SOAP tiene:

  • Un Envelope (sobre).
  • Un Header (encabezado opcional).
  • Un Body (cuerpo con la información).

3. Estructura de un mensaje SOAP

Ejemplo de solicitud (request):

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:cli="http://ejemplo.com/clientes">
    <soap:Header/>
    <soap:Body>
        <cli:getClienteRequest>
            <cli:id>101</cli:id>
        </cli:getClienteRequest>
    </soap:Body>
</soap:Envelope>

Explicación:

  • <soap:Envelope>: contenedor principal.
  • <soap:Header>: metadatos (por ejemplo, autenticación).
  • <soap:Body>: contiene la petición real (getClienteRequest).
  • El namespace cli indica que pertenece al servicio de clientes.

Ejemplo de respuesta (response):

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:cli="http://ejemplo.com/clientes">
    <soap:Body>
        <cli:getClienteResponse>
            <cli:cliente>
                <cli:id>101</cli:id>
                <cli:nombre>Ana</cli:nombre>
                <cli:ciudad>Córdoba</cli:ciudad>
            </cli:cliente>
        <cli:getClienteResponse>
    </soap:Body>
</soap:Envelope>

La respuesta envuelve los datos del cliente dentro del <soap:Body>.

4. WSDL: contrato del servicio

Un WSDL (Web Services Description Language) es un archivo XML que describe cómo interactuar con un servicio SOAP.

  • Qué operaciones existen.
  • Qué parámetros aceptan.
  • Qué estructura de respuesta generan.

Es el manual que usan los clientes para consumir el servicio.

Ejemplo (simplificado):

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:tns="http://ejemplo.com/clientes"
             targetNamespace="http://ejemplo.com/clientes">

  <message name="getClienteRequest">
    <part name="id" type="xsd:int"/>
  </message>

  <message name="getClienteResponse">
    <part name="cliente" type="tns:Cliente"/>
  </message>

  <portType name="ClientePortType">
    <operation name="getCliente">
      <input message="tns:getClienteRequest"/>
      <output message="tns:getClienteResponse"/>
    </operation>
  </portType>
</definitions>

Aquí se define que la operación getCliente recibe un id y devuelve un Cliente.

5. Ejemplo de consumo de un servicio SOAP

a) En Python (con zeep)

from zeep import Client

# Cargar el WSDL
client = Client("http://ejemplo.com/clientes?wsdl")

# Llamar a la operación getCliente
respuesta = client.service.getCliente(id=101)

print(respuesta)

La librería zeep usa el WSDL para generar automáticamente las llamadas.

b) En Java (con JAX-WS)

import javax.xml.ws.Service;
import java.net.URL;
import javax.xml.namespace.QName;

public class ClienteSOAP {
    public static void main(String[] args) throws Exception {
        URL wsdlURL = new URL("http://ejemplo.com/clientes?wsdl");
        QName qname = new QName("http://ejemplo.com/clientes", "ClienteService");
        Service service = Service.create(wsdlURL, qname);
        ClientePort port = service.getPort(ClientePort.class);

        Cliente cliente = port.getCliente(101);
        System.out.println("Cliente: " + cliente.getNombre());
    }
}

c) En C# (.NET, WCF)

using System;

class Program {
    static void Main() {
        var cliente = new ClienteService.ClientePortClient();
        var respuesta = cliente.getCliente(101);
        Console.WriteLine("Cliente: " + respuesta.nombre);
    }
}

En C#/.NET, el WSDL genera automáticamente clases y métodos equivalentes al servicio.

6. Ventajas y desventajas de XML en Web Services

Ventajas

  • Estándar abierto, soportado en casi todos los lenguajes.
  • Permite interoperabilidad entre sistemas (Java, .NET, Python, etc.).
  • Muy usado en sectores como banca, seguros, gobierno.
  • El WSDL actúa como contrato formal.

Desventajas

  • Verboso (mucho texto comparado con JSON).
  • Más complejo de implementar que REST.
  • Performance menor en redes lentas.

Por eso hoy REST/JSON es más popular en apps modernas, pero SOAP/XML sigue vigente en el mundo empresarial.

7. Ejemplo práctico real

Un banco ofrece un Web Service SOAP para consultar el saldo de una cuenta:

Request

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getSaldoRequest xmlns="http://banco.com/servicios">
      <numeroCuenta>123456</numeroCuenta>
    </getSaldoRequest>
  </soap:Body>
</soap:Envelope>

Response

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getSaldoResponse xmlns="http://banco.com/servicios">
      <saldo>10500.75</saldo>
      <moneda>ARS</moneda>
    </getSaldoResponse>
  </soap:Body>
</soap:Envelope>

8. Resumen didáctico

  • XML fue durante mucho tiempo el formato principal para Web Services.
  • SOAP organiza los mensajes en Envelope → Header → Body.
  • WSDL define las operaciones disponibles en el servicio.
  • Se puede consumir desde cualquier lenguaje gracias a su estandarización.
  • Aunque REST/JSON es hoy más común, SOAP/XML sigue siendo clave en sistemas empresariales críticos.