Cómo hacer llamadas a Servicios SOAP desde PHP

¡Artículo Actualizado!
Artículo actualizado al 20/03/2021.

Los servicios SOAP (Simple Object Access Protocol), son ampliamente utilizados para cualquier tipo de integración con aplicaciones. Desde facturación hasta medios de pago de todo el mundo.

En estos servicios enviamos nuestros datos utilizando XML con la estructura requerida por el servicio y este generalmente nos devolverá también datos mediante de XML.

Hay varias librerías disponibles para PHP que nos permitirán consumir servicios SOAP si por algún motivo no contamos con la clase oficial SOAP para PHP activa en el servidor, este es el caso de NuSOAP, por ejemplo.

En esta guía vamos a ver como consumir un servicio SOAP con la librería oficial de PHP de manera rápida y súper simple.

Para los ejemplos utilizaré este servicio gratuito que nos permitirá realizar algunos calculos matemáticos básicos. Sencillamente enviaremos los valores y el webservice nos responderá el resultado.

Datos necesarios para realizar la llamada SOAP

Antes que nada, para utilizar SOAP en PHP con la librería oficial, necesitaremos tener activo en nuestro entorno local/servidor la extensión de SOAP. En XAMPP para Windows, deberás verificar que tengas activa esta extensión de PHP, tendrás que revisar la siguiente línea del archivo php.ini

extension=php_soap.dll

Si tenemos un símbolo ; al comienzo de esta línea en nuestro php.ini significa que la extensión está desactivada. En ese caso necesitaremos quitar el ; inicial y reiniciar nuestro servidor Apache (o el que utilicemos en nuestro entorno local/servidor).

En servidores Linux deberás ejecutar un comando de consola para realizar la instalación de la extensión SOAP. Puedes obtener información aquí.

Te puede interesar:  El futuro es hoy: Por qué deberías empezar a utilizar Inteligencia Artificial

Una vez activa nuestra extensión SOAP de PHP debemos tener los datos necesarios para realizar el request que son:  URL del servicio SOAP, el método que queremos ejecutar de este servicio y la estructura de parámetros que enviaremos en nuestro Request.

Para propósitos de este artículo nuestra URL es: https://www.crcind.com/csp/samples/SOAP.Demo.CLS?WSDL

En un caso ideal vamos a contar con la documentación necesaria que nos indicará los métodos y parámetros a ejecutar pero, si no es así, no será problema porque podemos ingresar a la URL del servicio desde el navegador y tomar los detalles desde la misma estructura que nos mostrará.

Para el caso de este ejemplo el mismo Web Service es explicativo. La documentación se puede ver en: https://www.crcind.com/csp/samples/SOAP.Demo.CLS

Pero si no fuera el caso solo bastaría con entrar a la URL del servicio para visualizar nosotros mismos la definición del método y los parámetros que debemos enviar. Como se puede ver aquí:

En la imagen podemos observar y ubicar nuestro método a cosumir (AddInteger) y los parámetros (Arg1, Arg2) necesarios para ejecutarlo. Un servicio SOAP puede tener más de un método dependiendo de sus funcionalidades y todos se verán listados con la estructura antes mencionada.

El código a ejecutar es el siguiente:

Paso a explicar:

Primero tenemos unas líneas de debug. Podemos activarlo o desactivarlo y nos va a mostrar o no los errores de PHP. Solo cambiamos TRUE o FALSE dependiendo del entorno en que estemos trabajando.

define("DEBUG", TRUE);

Luego tenemos esta línea:

$wsdl = 'https://www.crcind.com/csp/samples/SOAP.Demo.CLS?WSDL';

Aquí es donde debemos reemplazar el valor actual por la URL de nuestro servicio SOAP.

Luego tenemos la variable $params que es un array de los parámetros que debemos enviar a nuestro servicio, aquí armamos la estructura de parámetros que determinamos en uno de los pasos anteriores.

//Basados en la estructura del servicio armamos un array 
$params = Array(
    "Arg1" => 5,
    "Arg2" => 10
    );

En el caso de este ejemplo tenemos dos parámetros Arg1 y Arg2 que son dos valores enteros a sumar, pero podríamos tener varios parámetros o incluso parámetros que también sean array del estilo:

//Basados en la estructura del servicio armamos un array
$params = Array(
    "Arg1" => 10,
    "Ejemplo" => Array( "VAL1" => "valor", "VAL2" => "valor2" )
    );

Recordemos que a final de cuentas, basándose en este array, la clase de SOAP armará una estructura de árbol XML que tiene nodos padres nodos hijos e hijos de los hijos.

Te puede interesar:  Proyecto LuchoGPT: El bot que recopila y comenta noticias en X

La última línea importante es la siguiente:

$result = $soap->AddInteger($params);

Aquí, una vez inicializado el objeto, vamos a tener que cambiar el método a ejecutar que en esta línea es «AddInteger» por el método correspondiente de nuestro servicio.

¡Y listo! Eso es todo, ahora en la variable $result vamos a tener la respuesta de nuestro request. En la última línea le hacemos un var_dump para ver el resultado y estructura que recibimos. Con base en eso ya podemos darle el formato que se nos ocurra a la información.

Factores de rendimiento en entorno de producción

Como última observación, en cuanto a optimización y velocidad, podemos llegar a encontrarnos con inconvenientes dependiendo de para que estemos utilizando el servicio. A veces las ejecuciones del servicio SOAP son extremadamente lentas.

Puede que en una utilización básica donde solo queremos obtener algunos datos, como en el caso del ejemplo, no afecte en nada que la página tarde en cargar 1 o 1.5 segundos más, pero hay casos donde cada milisegundo cuenta.

En caso de que encontremos estos problemas vamos a tener que trabajar con las opciones de caché de las llamadas SOAP de la misma clase de PHP. En la variable de $options del código que hemos visto ya tenemos activadas las funciones de caché, pero hay más configuraciones en el php.ini que nos pueden servir.

Luciano Joan Vergara

Luciano Joan Vergara

Desarrollador de software con 10 años de experiencia. Apasionado por la tecnología y desarrollo de proyectos que generen impacto. He trabajado con clientes de Argentina, España, Inglaterra, Chile, Colombia y USA.

Comentarios (No hay comentarios)

wave