Recientemente nos han llegado un par de proyectos en los que debemos consumir webservices SOAP para obtener datos. La verdad es que hacía bastante tiempo que no los veía en mi trabajo habitual. Hace algunos años eran muy habituales para casi cualquier cosa que implicase comunicación con fuentes externas, sin embargo los últimos años habían caído un poco en desuso para cosas sencillas puesto que complicaban bastante un trabajo que con una simple petición HTTP y un XML básico se podría resolver. Precisamente ésta ha sido siempre una de las mayores críticas al protocolo SOAP, el elevado consumo de ancho de banda para una sencilla petición.

Hasta ahora siempre había utilizado nusoap para realizar llamadas SOAP desde PHP, sin embargo  me encontré con un problema al acceder a un servicio de un importante medio de comunicación internacional. La llamada con nusoap no devolvía resultados mientras que desde el sistema de pruebas html todo funcionaba correctamente.

Después de darle mil vueltas y no encontrar ningún error (otras peticiones al mismo servicio sí que funcionaban) me dí cuenta que PHP ya tiene un conjunto de funciones SOAP nativas, con lo que no necesitaría nusoap. La duda era saber si funcionaría bien, como así fue. Tras añadir la extensión adecuada surge una pequeña incompatibilidad. No puedes usar nusoap y las funcionas nativas en la misma instalación de PHP. Dicho de otro modo, si activas la extensión SOAP, nusoap dejará de funcionar y comenzará a lanzar mensajes de error ya que muchas de las funciones que utiliza tienen el mismo nombre que las nativas, que serían entonces nombres reservados. Si tienes alguna aplicación que utilice nusoap en la misma máquina tendrás que migrarla también para que utilice las funciones nativas.

El ejemplo de hoy será una sencilla llamada a un servicio que nos devuelve un listado de noticias.

El proceso es muy sencillo, necesitas la url del webservice, el método al que vas a llamar y los parámetros a pasarle y, como en cualquier servicio SOAP, te devolverá un XML.

  1. $servicio="http://dominio.com/noticias?wsdl"; //url del servicio
  2. $parametros=array(); //parametros de la llamada
  3. $parametros[‘idioma’]="es";
  4. $parametros[‘usuario’]="manolo";
  5. $parametros[‘clave’]="tuclave";$client = new SoapClient($servicio, $parametros);
  6. $result = $client->getNoticias($parametros);//llamamos al métdo que nos interesa con los parámetros

Con estas sencillas instrucciones ya tenemos en $result el XML resultado de la llamada al servicio. Como trabajar con el XML es un poco engorroso, lo convertimos a un array asociativo de manera que nos sea más sencillo procesar los datos, para ello utilizamos la función obj2array que indico a continuación.

  1.  
  2. $result = obj2array($result);
  3. $noticias=$result[‘resultado’][‘noticias’];
  4. $n=count($noticias);
  5.  
  6. //procesamos el resultado como con cualquier otro array
  7. for($i=0; $i<$n; $i++){
  8.     $noticia=$noticias[$i];
  9.     $id=$noticia[‘id’];
  10.     //aquí iría el resto de tu código donde procesas los datos recibidos
  11. }
  12.  
  13. function obj2array($obj) {
  14.   $out = array();
  15.   foreach ($obj as $key => $val) {
  16.     switch(true) {
  17.         case is_object($val):
  18.          $out[$key] = obj2array($val);
  19.          break;
  20.       case is_array($val):
  21.          $out[$key] = obj2array($val);
  22.          break;
  23.       default:
  24.         $out[$key] = $val;
  25.     }
  26.   }
  27.   return $out;
  28. }

En la segunda línea nos quedamos con los elementos del array que nos interesa procesar. Si no sabes qué devuelve tu webservice puedes hacer un var_dump($result) y verás todo el resultado. En nuestro caso, como es una secuencia de noticias, nos quedamos con el elemento que tiene esas noticias.

Como os habréis dado cuenta, no me he preocupado del control de errores al llamar al webservice.  Eso os lo dejo como ejercicio a vosotros, que es agosto y no me apetece icon razz Consumiendo webservices SOAP desde PHP webservice soap PHP . En el manual de PHP está toda la información.

Y eso es todo amigos, hoy ha sido un ejemplo sencillo pero muy útil cuando necesitas utilizar SOAP.