Saltar al contenido principal

SOAP, un protocolo simple de acceso a objetos... Decían

· 5 min de lectura
Héctor Mansilla Arias

SOAP es un protocolo estándar que se creó originalmente para permitir la comunicación entre las aplicaciones que se diseñaban con diferentes lenguajes y en diferentes plataformas. Como es un protocolo, impone reglas integradas que aumentan la complejidad y la sobrecarga, lo cual puede retrasar el tiempo que tardan las páginas en cargarse. Sin embargo, estos estándares también ofrecen normas integradas que pueden ser ideales para el sector empresarial. Los estándares de cumplimiento integrados incluyen la seguridad, la atomicidad, la uniformidad, el aislamiento y la durabilidad (ACID), que forman un conjunto de propiedades que garantizan operaciones confiables de las bases de datos.

Las especificaciones comunes de los servicios web incluyen lo siguiente:

Seguridad de los servicios web (WS-Security): estandariza la forma de proteger y transferir los mensajes usando identificadores únicos llamados tokens. Mensajería segura de los servicios web (WS-ReliableMessaging): estandariza el control de errores entre mensajes que se transfieren en infraestructuras de TI poco confiables. Abordaje de los servicios web (WS-Addressing): paquetes que enrutan la información como metadatos dentro de los encabezados SOAP, en lugar de mantener la información en un lugar más profundo de la red. Lenguaje de descripción de los servicios web (WSDL): describe qué hace un servicio web, así como dónde comienza y termina. El envío de una solicitud de datos a una API de SOAP se puede administrar a través de cualquiera de los protocolos de la capa de la aplicación: HTTP (para los exploradores web), SMTP (para el correo electrónico), TCP, entre otros. Sin embargo, una vez que se recibe una solicitud, los mensajes SOAP de retorno deben ser documentos XML, que es un lenguaje de marcado que comprenden las personas y las máquinas. Una solicitud completa a una API de SOAP no se almacena en caché por un navegador, por lo que no se puede acceder a ella después sin reenviarla a la API.

Entonces… ¿Cuál es la diferencia entre SOAP y REST? Es posible que muchos sistemas heredados sigan rigiéndose por SOAP, aunque REST haya surgido más tarde y se considere una alternativa más rápida en los escenarios basados en la Web. REST es un conjunto de pautas que ofrece una implementación flexible, mientras que SOAP es un protocolo con requisitos específicos, como en el caso de la mensajería XML.

Las API de REST son ligeras, así que son ideales para los contextos más nuevos, como el Internet de las cosas (IoT), el desarrollo de aplicaciones móviles y la informática sin servidor. Los servicios web de SOAP ofrecen seguridad y cumplimiento de las operaciones integrados que coinciden con muchas de las necesidades empresariales, pero que también los hacen más pesados. Asimismo, muchas API públicas, como la API de Google Maps, siguen las pautas de REST.

¿Cómo es una estructura SOAP?

POST /example HTTP/1.1
Host: example.org
Content-Type: text/xml; charset=utf-8
...
<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
SOAP-ENV:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
...
<SOAP-ENV:Header>
...
</SOAP-ENV:Header>

<SOAP-ENV:Body>
...
</SOAP-ENV:Body>

</SOAP_ENV:Envelope>

En este ejemplo, la solicitud comienza con un encabezado HTTP. A continuación, sigue el llamado Envelope (sobre) de SOAP, que envuelve el contenido real del mensaje como un sobre. Los elementos principales de SOAP son el Header (encabezado) y el Body (cuerpo).

Header: el encabezado de la solicitud SOAP contiene metadatos como la encriptación que se ha utilizado. Su uso es opcional. Body: en el cuerpo del mensaje se encuentran los datos en sí. Los conceptos utilizados en el Body no tienen nada que ver con SOAP, sino que dependen completamente de la aplicación.

El protocolo aparece a menudo en combinación con el lenguaje WSDL (Web Services Description Language). Se trata de un lenguaje de descripción especial para servicios web que, por otra parte, no depende de plataforma. Con su ayuda, un cliente puede reconocer qué servicios ofrece un servicio web. A partir del archivo WSDL, el cliente deduce qué posibilidades tiene para realizar una solicitud SOAP. El dúo WSDL y SOAP permite que dos sistemas diferentes se comuniquen sin tener que adaptarse previamente.

¿Cómo puedo usar de forma simple un Web Service con SOAP? De los creadores de Swagger, si si los mismos del estándar de documentación de las API REST, llega una aplicación Open Source llamada SoapUI. Rayos, qué nombre tan creativo!

Interfaz gráfica de SoapUI No hay mucho que explicar respecto al uso, lo principal es tener la URL del Web Service y, en mi caso, el nombre de usuario y contraseña, SoapUI explora el Web Service y abre todos los servicios que pueden ser llamados con su estructura básica.

¿Cómo acceder a SOAP desde NODE.js? Afortunadamente, Axios y XML2js vienen al rescate… ambas librerías de NODE nos permiten tener lo necesario para implementar un acceso a SOAP. Para este ejemplo usaremos el LOGIN del SOAP que necesitamos acceder. Esta es su estructura:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://www.ca.com/UnicenterServicePlus/ServiceDesk">
<soapenv:Header/>
<soapenv:Body>
<ser:login>
<username>?</username>
<password>?</password>
</ser:login>
</soapenv:Body>
</soapenv:Envelope>

Lógicamente, las credenciales están representadas por signos de interrogación, los cuales en el código serán cambiados por variables de entorno en un template literal.

// Cargamos las variables de entorno y luego llamamos a las librerías de terceros
require('dotenv').config()
const axios = require('axios');
const xml2js = require('xml2js');

// Asignamos las variables de entorno para su uso
const credentialsSoapUser = process.env.SOAP_USER;
const credentialsSoapPass = process.env.SOAP_PASS;
const urlSoap = process.env.SOAP_URL;

//Creamos una instancia del Parser XML
let parserXml = new xml2js.Parser();

// Definimos la consulta, en un template literal para poder asignarle los valores del Username y Password
let xmlQuery =
`<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://www.ca.com/UnicenterServicePlus/ServiceDesk">
<soapenv:Header/>
<soapenv:Body>
<ser:login>
<username>${credentialsSoapUser}</username>
<password>${credentialsSoapPass}</password>
</ser:login>
</soapenv:Body>
</soapenv:Envelope>`;

// Creamos y exportamos la función login, la cual será la responsable de acceder al servidor SOAP
exports.login = async () => {
try {
responseSoap = await axios.post(urlSoap,
xmlQuery,
{
headers:
{ 'Content-Type': 'text/xml',
'SOAPAction':''
}
});
// Se usa el Parser XML para los datos recibidos
let responseData = await parserXml.parseStringPromise(responseSoap.data);
return responseData;
} catch (err) {
console.log(err);
}
}

Aún queda mucho camino por recorrer, pero dejo estas líneas para la posterioridad y ante la ausencia de documentación en español.