Variaciones con PHP y SOAP

Un día, te llega tu jefe y te dice «Cuando tengas un rato, implementa en PHP una API con SOAP para que se conecten nuestros partners» o «Para cuando estés aburrido, a ver si te conectas desde nuestro panel PHP a los servicios SOAP de nuestro proveedor».

Lo primero que haces es intentar hacerte una idea desde los fundamentos. Pero cuando comienzas a ojear las especificaciones, te das cuenta que es un bocado difícil de digerir y que el esfuerzo de programar algo desde cero es inviable para la agenda que te han asignado.

Como segunda alternativa, comienzas a googlear a ver si encuentras pequeños tutoriales de personas que hayan tenido que resolver tu misma problemática, a ver si puedes usar sus consejos como plantillas para resolver tu propio problema. Afortunadamente, te encuentras con bastantes ejemplos. A veces son un poco confusos, pero comienzas a hacerte una idea de por dónde puedes encaminarte.

Lo primero, es que decido usar la librería NuSOAP. Lleva tiempo sin actualizarse, pero los ejemplos que encuentro son muy prometedores. Y, poco a poco, a base de prueba y error y leer muchos ejemplos por la red, comienzas a destilar tus propio código adaptado a tus necesidades.

Mi intención en esta entrada no es explicar sistematicamente ni SOAP ni NuSOAP porque tengo todavía muchos cabos sueltos. Pero, al menos, compartir unos cuantos ejemplos simples que quizás ayuden a otros a construir sus propias herramientas. He escrito estos ejemplos a modo de variaciones cada vez más complejas, para que comparándolos podáis entender las diferencias. A ver si estos ejemplos os sirven de ayuda.

Variación número 1: sumar dos números

El primer ejemplo es lo más simple posible (como aperitivo): sumar dos números. Podéis ver el ejemplo operativo aquí.

Primero veamos el código para el servidor:

Ya está. Con este pequeño código, tenemos un servicio SOAP plenamente operativo. NuSOAP hace toda la magia. Básicamente:

  • Creas tu objeto $server.
  • Declaras el servicio addNumbers que va a tener unos parámetros de entrada y de salida y que asocias a tu función PHP addNumbers que defines un poco más abajo.
  • Ejecutas tu servicio llamando a su método service.

Una cualidad de NuSOAP es que no sólo te implementa el servicio, sino que además te construye el documento WSDL necesario para publicarlo. Para este servicio concreto, puedes acceder a su WSDL en esta url. Si lo ojeáis, veréis que es un documento xml donde explica qué es lo que hace el servicio que hemos programado y publicado.

Ahora, veamos el cliente:

Este código es un poco más extenso. El motivo es que lo he encapsulado en una clase (para facilitar la programación del test que podéis ejecutar) y porque debe tener en cuenta la atención de errores. Vamos a repasar los puntos más importantes:

  • En el método __construct crea un objeto nusoap_client al que le pasa como parámetro la url correspondiente al documento WSDL publicado por el servicio (por eso, es tan importante el documento wsdl).
  • El meollo del código está en el método run donde declara los parámetros que se le van a pasar al servicio y lo llama mediante el método call.
  • El resto del código, está destinado a comprobar si ha habido algún error e ir rellenando un array log para pasárselo al test de modo que éste pueda tener una traza de lo que ha ocurrido.

Variación número 2: dividir dos números

El primer ejemplo, ha sido lo más simple posible: espera dos enteros como parámetros y devuelve un valor entero como resultado. Pero, normalmente, necesitamos comunicar parámetros más complejos. Por ejemplo, supongamos que quiero programar un divisor y que éste va a devolver una estructura:

  • Un status que es una cadena que valdrá ‘ok’ si la división se efectuó correctamente o ‘error’ si hubo algún error.
  • Un message con una cadena que es un mensaje referente al resultado.
  • Un result que es el resultado de la división.

Podéis ver el ejemplo operativo aquí (podéis probar a dividir por cero).

Veamos el servicio:

Si comparáis el servicio anterior con éste, veréis que comparten la misma estructura. Las diferencias son:

  • En lugar de devolver un sólo parámetro result devuelve tres parámetros status, message y result.
  • La función asociada, en lugar de devolver un valor simple, ahora devuelve un array.

En cuanto al cliente:

También comparte la misma organización del cliente anterior. Excepto que ahora el resultado $result que recibe será un array.

Variación número 3: devolver una estructura compleja

Esta tercera variación es muy similar a la anterior: espera un código de empleado y devuelve los datos de dicho empleado. Podéis ejecutar el ejemplo aquí.

Veamos el servidor:

Si leéis este nuevo servicio, la diferencia importante es que creamos una estructura employeeData que será la que se devuelva como resultado ('result' => 'tns:employeeData').

Ahora, veamos el cliente:

Esta vez, el cliente no nos aporta nada nuevo. Se limita a recibir el resultado (como un array indexado) y a procesarlo correctamente.

Variación número 4: devolver una lista de empleados

Este último ejemplo, vamos a devolver una lista de empleados. Esperaremos un nombre de empleado y devolverá un array con todos los empleados que tenga dicho nombre. Podéis consultar el ejemplo aquí.

Veamos el servidor:

La clave de este ejemplo es que, una vez definido nuestro tipo complejo employeeData, definimos un segundo tipo complejo employeeDataArray que es un array de employeeData.

El cliente para este servicio es similar al anterior:

¿Conclusiones?

Me he quedado con las ganas de comprender al 100% los fundamentos tanto de SOAP como los de NuSOAP. Pero la presión de los proyectos es muy grande. Pero, al menos, conseguí ejecutar la tarea. Espero que estos pequeños ejemplos ayuden a alguien que se vea en la misma encrucijada que yo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
*
Sitio Web