Consumiendo servicios web Axis2 desde PHP con NuSOAP

axis.jpgAunque el titulo sea largo, la practica es mucho más corta y fácil.

NuSOAP es una librería escrita en PHP para poder crear y consumir servicios web por medio de SOAP(de ahí el nombre de la librería :P ), al principio me dio un poco de miedo el hecho de que hace más de un año que no se actualiza, pero después de usarla un rato, me dí cuenta de que no era necesario, por ahora la única falla que le encontré es la que explicaré más abajo.

Axis2 es una implementación de Apache para poder hacer lo mismo que NuSOAP, con la diferencia de que los servicios se crean y se consumen en Java.

La idea es la siguiente: en la empresa en donde trabajo existe un servidor(en realidad varios, dispersados por todo el país) que autentica vía LDAP a los usuarios de una red extremadamente gigante, este servicio web creado para Axis2 se encargará de recibir peticiones y responder si la autenticación del usuario en un sistema(los sistemas que creamos son aplicaciones web que una vez que autentican contra ldap, guardan los datos en una base local y el usuario queda automáticamente registrado, si no fue registrado por el administrador de ese sistema antes) fue valida o no.

Como esta empresa tiene infinidad de sistemas y una variedad bastante amplia de arquitecturas y lenguajes, debemos hacer algo que sea lo más genérico posible, para esto se tomó en cuenta "cuantos sistemas en que lenguaje" y la mayoría son sistemas escritos en PHP, Java y .NET, por lo tanto, debemos hacer tres clientes para cada lenguaje(en realidad el de Java fue escrito al mismo tiempo que se escribió el servicio, así que uno de los tres ya está cubierto), el de PHP me tocó a mi, y fue mucho más simple de lo que esperaba.

Entrando un poco más en detalle, mi idea es hacer un objeto que simplemente le devuelva al sistema los datos del usuario, en el caso de que sus credenciales sean correctas, pero la base de esto(el objeto puede ser descomunal<<cosa que no es>>, pero si esta base no funciona, de nada sirve) es la comunicación entre mi objeto cliente y el servicio web que me espera del otro lado.

Basta de introducciones, quien haya entrado vía google o por donde fuere buscando esto, busca código, acá está:

PHP:
  1. &lt;?
  2. include_once("lib/nusoap.php"); //Incluimos la librería
  3. // El servicio lo consumo usando su wsdl, de otra manera, por alguna razón, no funciona y axis2 devuelve un error 500
  4. $wsdl    =  "http://url_del_servicio/axis2/services/wsValidarLdap?wsdl";
  5. $clsNusoap = new soapclient($wsdl, true); // instanciamos el objeto y le avisamos en el segundo parametro que utilizaremos la descripcion wsdl
  6. $clsNusoap-&gt;setDebugLevel(9); //quiero el máximo nivel de debug
  7. // Los parámetros que necesito enviar se arman en un array
  8. $arParams = array("usuarioNombre"=&gt;"Pablo", "usuarioClave"=&gt;"pablo123");
  9.  
  10. // Finalmente hago el llamado al servicio, no hace falta pasarle más parámetros a este método ya que
  11. // la misma clase se encarga de armarlos al recibir el wsdl como descripción
  12. $resultado = $clsNusoap-&gt;call("Validar", array($arParams));
  13.  
  14. // Si bien acá solo imprimo, la idea es tomar $clsNusoap-&gt;response y parsear el XML que me devuelve
  15. // el servicio a mi gusto
  16. echo "&lt;h2&gt;Return&lt;/h2&gt;";
  17. print_r($clsNusoap-&gt;response);
  18.  
  19. // El resto son mensajes de debug
  20. echo "&lt;h2&gt;Errors&lt;/h2&gt;".$clsNusoap-&gt;getError();
  21. echo '&lt;h2&gt;Request&lt;/h2&gt;&lt;pre&gt;'htmlspecialchars($clsNusoap-&gt;request, ENT_QUOTES) . '&lt;/pre&gt;';
  22. echo '&lt;h2&gt;Response&lt;/h2&gt;&lt;pre&gt;' . htmlspecialchars($clsNusoap-&gt;response, ENT_QUOTES) . '&lt;/pre&gt;';
  23. echo '&lt;h2&gt;Debug&lt;/h2&gt;&lt;pre&gt;' . htmlspecialchars($clsNusoap-&gt;debug_str, ENT_QUOTES) . '&lt;/pre&gt;';

y la respuesta es algo parecido a esto

XML:
  1. &lt;?xml version='1.0' encoding='ISO-8859-1'?&gt;
  2. &lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"&gt;
  3. &lt;soapenv:Body&gt;
  4. &lt;ns:ValidarResponse xmlns:ns="http://ws.apache.org/axis2/xsd"&gt;
  5. &lt;ns:return&gt;
  6. &lt;data&gt;
  7. &lt;validar&gt;
  8. true
  9. &lt;/validar&gt;
  10. &lt;nombre&gt;
  11. Pablo
  12. &lt;/nombre&gt;
  13. &lt;apellido&gt;
  14. Fabregat
  15. &lt;/apellido&gt;
  16. &lt;mail&gt;
  17. mail
  18. &lt;/mail&gt;
  19. &lt;ug&gt;&lt;/ug&gt;
  20. &lt;server&gt;xxx&lt;/server&gt;
  21. &lt;status&gt;0&lt;/status&gt;
  22. &lt;msg&gt;
  23. Connected to: xxx. trustStorePath: . searchBase: dc=xxx. searchFilter: sn=Pablo. Find userDN: cn=Pablo,ou=Person,cn=admin,dc=xxx. &lt;/msg&gt;
  24. &lt;/data&gt;
  25. &lt;/ns:return&gt;
  26. &lt;/ns:ValidarResponse&gt;
  27. &lt;/soapenv:Body&gt;
  28. &lt;/soapenv:Envelope&gt;

Y eso es todo, perdón por los tags mal interpretados, es algo que voy a arreglar en estos días, pero para ver el código correctamente, hagan click en plain text.

No hay Trackbacks

You can leave a trackback using this URL: http://www.documentandolavida.com.ar/2007/08/10/consumiendo-servicios-web-axis2-desde-php-con-nusoap/trackback/

One Comentario

  1. muy bueno lo de validar contra LDAP los usuarios, o sea como casi todas las empresas tiene active directory, me gusta que los sistemas se validen siempre con una sola credencial, no que tenga un user y pass para una cosa y otro para otro y asi... sin contar que se pueden armar lindas consolas (a parte de las que ya hay) para las cosas nuevas que les agregan, y los usuario casi siempre recuerdan un user y un pass, 2 o 3 no :P

    NeO83666
    Andres

    Comentado agosto 10, 2007 a las 7:48 pm | Permalink

Escribe un Comentario

Tu e-mail nunca será compartido. Los campos requeridos están marcados *

*
*