Codigo

Consumiendo webservices con drupal desde el código

webservice

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:

Como lo había mencionado anteriormente, lo primero que hice fue googlear un rato y proponer una solución de la cual tenía documentación, sin embargo para reutilizar esta configuración en otro sitio, era necesario llevar sus configuraciones, lo que sin duda es algo tedioso, para solventar este percance lo más obvio dirían los expertos, sería desarrollar un módulo personalizado y tener el control de todo, desde utilización de operaciones del webservice, así como en la presentación de los datos.
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

Lo primero que debemos hacer es invocar el HOOK dentro nuestro módulo personalizado, como lo veremos en el siguiente ejemplo:
/**
 * 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.
 

Secciones: