Usando XMLRPC con Services

Services es un módulo que permite definir web services que responden a solicitudes usando diversos protocolos. Por default, viene con soporte para XMLRPC.

En este ejemplo, hay un proveedor de web services y un cliente de web services.

Proveedor
Supongamos que el proveedor del web service tenga el url http://webservice-provider.com

Luego de instalar el módulo services (y activar Services y XMLRPC Server) puede entrar al administrador, admin/build/services, para navegar por los services definidos por default.

Uno puede agregar más services, colocando un módulo adecuado en modules/services/services/.

Por ejemplo, si tengo un tipo de contenido llamado job:

modules/services/services/job_service/job_service.info
name = Job Service
description = Provides a job service
package = Services - services
dependencies[] = services
core = 6.x


modules/services/services/job_service/job_service.module
/**
 * Implements hook_service
 */
function job_service_service() {
  return array(
    array(
      '#method' => 'job.all',
      '#callback' => 'job_service_all',
      '#return' => 'array',
      '#args' => array(
        array(
          '#name' => 'fields',
          '#type' => 'array',
          '#optional' => TRUE,
          '#description' => t('List of fields')
        ),
        array(
          '#name' => 'limit',
          '#type' => 'int',
          '#optional' => TRUE,
          '#description' => t('To limit result')
        )
      ),
      '#help' => t('Returns a list of the trabajo content type nodes.'),
      '#access callback' => 'job_service_all_access'
    )
  );
}
/**
 * Callback
 */
function job_service_all($fields=array(), $limit=0) {
  $sql = "SELECT * FROM {node} WHERE type='job'";
  if ($limit>0) {
    $sql .= " LIMIT $limit";
  }
  $result = db_query($sql);
  $nodes = array();
  while ($node = db_fetch_object($result)) {
    $nodes[] = services_node_load(node_load($node->nid), $fields);
  }
  return $nodes;
}
/**
 * Access Callback
 */
function job_service_all_access() {
  return TRUE;
}

Una vez definido, se puede probar en la lista de services que aparece en admin/build/services.

Cliente
En el cliente del web service, se puede probar el acceso al web service del proveedor con algo como:

/**
 * Implemens hook_menu
 */
function misc_menu() {
  $items = array();
  $items['misc/test'] = array(
    'page callback' => 'misc_test',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function misc_test() {
  $items = xmlrpc('http://webservice-provider.com/xmlrpc.php', 'job.all');
  pr($items);
  pr($openid_provider['url'].'xmlrpc.php');
  return 'OK';
}

Como se observa, xmlrpc() permite invocar al service job.all. El url es el del archivo xmlrpc.php localizado en el proveedor.

Si hubiera más argumentos, serán pasados en el mismo orden al método que atiende el service. En este caso, job_service_all().

Comentarios

Entradas populares de este blog

Debug con Xdebug y Aptana (y Notepad++)

Drupal sí, drupal no

CSS3 para mejorar el breadcrumb de un tema Zen