Consumiendo webservices con drupal desde el código

Hablar de webservices es sin duda hablar de versatilidad e integración de sistemas para interactuar en el intercambio y operación sobre los datos.
Y una de las ventajas de Drupal es su API de desarrollo que nos facilita el trabajo de manera impresionante, para que reinventar la rueda.
Hace un tiempo en mi trabajo surgió la necesidad de implementar un servicio de consulta que consuma un webservice generado en java (jboss) desde el sitio web institucional (drupal), para lo cual lo primero fue googlear un buen rato y encontrar un ejemplo de webservice implementado con reglas(rules) desde la interfaz de usuario https://www.drupal.org/node/1114308, sin embargo esto conllevaria a limitarse un poco para dar formato a los datos obtenidos y a exponer datos sensibles como datos de acceso al webservice.
Los módulos de las cuales hablaré en esta publicación son:
Puntualmente en este post no hablaré sobre la creación de un módulo personalizado, pero si lo que respecta a la utilización del webservice desde código.
LLamando al hook_default_wsclient_service
/** * Implements hook_default_wsclient_service(). */ function taxes_default_wsclient_service() { // Taxes from another system (SOAP) $ip = '192.168.1.20'; // IP from webservice source $port = '8080'; $service = new WSClientServiceDescription(); $service->name = 'taxes'; $service->label = 'Taxes getting from another system'; $service->url = 'http://' . $ip . ':'. $port . '/paymentPlatform?wsdl'; $service->type = 'soap'; try { $service->endpoint()->initializeMetaData(); $services[$service->name] = $service; } catch (WSClientException $e) { watchdog('wsclient', $e->__toString()); } return $services; // Here we can call more webservices }
Con el código que he mostrado nos permite realizar la conexión al webservice, es decir apuntar al ip, puerto y el nombre del webservice con su extensión que en este caso es wsdl, con esto ya hemos hecho lo que normalmente se haría desde la interfaz de usuario
http://www.misitio.com/admin/config/services/wsclient
El código lo he tomado de los ejemplos que proporciona el propio módulo wsclient, he cambiado los parametros que me sirven para mi escenario.
Operaciones del webservice
Para hacer uso de nuestro webservice podemos referirnos al README.txt del propio módulo en donde tiene la documentación para desarrolladores al final.
Usage for developers -------------------- * You can create web service descriptions in code, see for example wsclient_examples.module * You can easily invoke web services by loading the description and executing an operation (the operation name can be used a dynamic method name): $service = wsclient_service_load('google'); $result = $service->translate('Hallo Welt', 'de|en');
Aqui claramente nos especifica que podemos referirnos al wsclient_examples.module para crear un web service description (lo que vimos en el apartado anterior).
Para invocar a uno de los web services que pudimos haber definido en el apartado anterior, lo podemos hacer así:
$service = wsclient_service_load('taxes');
Aquí debemos asegurarnos que el nombre que el enviamos a esta función es el mismo que definimos en el apartado anterior como $service->name = 'taxes' es decir el nombre del webservices, ya que como mencioné puede haber más de uno.
Luego podemos hace uso de las operaciones como se muestra en este caso:
$result = $service->taxesquery('1100232587');
En esta variable $result nos proporcionará los datos devueltos contenido en un arreglo, para ver como esta estructurado este arreglo, podemos hacer uso de la función dsm, que es propia del módulo devel.
dsm($result);
Tipos de datos y operaciones del webservices
Para conocer en detalle como fuciona cada operacion y que parametros requeiere podemos hacer un seguimiento desde la parte grafica http://www.misitio.com/admin/config/services/wsclient desde aqui podremos ver, las operaciones y los tipos de datos que requiere cada uno para su funcionamiento.
Espero les haya servido este pequeño tutorial y cualquier comentario o sugerencia es bienvenido.