Expertos en Drupal

Uso del módulo restws en Drupal 7: Parte 2

Seguimos con el módulo RESTful Web Services para explicaros cómo configurar Drupal para que un script PHP pueda obtener datos remotamente y cómo programar un script que obtenga estos datos.

Uso del módulo restws en Drupal 7: Parte 2

Cómo configurar Drupal para el módulo restws

1) En el Drupal tendremos que crear un rol específico (p.e. "restws") y asignarle los siguientes permisos en función de nuestras necesidades:

  • Filter: Utilización de los formatos "Full HTML", "Filtered HTML" que nos interese compartir.
  • Node: Dar el permiso "Evita el control de acceso al contenido".
  • RESTful web services: Marcar todos los recursos que nos interese compartir.
  • Taxonomy: "Administra vocabularios y términos" o bien (recomendado) instalar el módulo Vocabulary Permissions Per Role y asignar sólo permisos sobre las taxonomías que nos interese compartir.
  • Taxonomy Acces Control Lite: Si utilizamos este módulo y nos interesa poder consultar detalles de las taxonomías que se utilizan para controlar el acceso al contenido, tendremos que dar permiso "administer tac_lite".

2) Así crearemos un usuario normal de Drupal que tenga este rol. Para que funcione, el "username" de este usuario tiene que comenzar por "restws". Una vez hecho, nos tenemos que asegurar de tener activado el submódulo "Basic authentication login".

3) Ahora ya sólo nos queda ver cómo conectarnos al servicio Drupal desde un script PHP.

<?php

// <URL_DRUPAL>/node.json?type=news&field_tag=2

$params = array();
$params['type'] = 'news';
$params['field_tag'] = '2';
$result = remote_query($params);

if ($result !== FALSE) {
  print_r($result);
}

/**
 * Do a remote query (the client is a Drupal with restws module).
 *
 * @param array $params
 *
 * @return array with results or FALSE if problem detected.
 */

function remote_query($params) {

  $username = 'restws_user';
  $password = 'ur_password';
  $domain = 'URL_DRUPAL';
  $get_url = 'node.json';

  $url = $domain . $get_url . '?' . http_build_query($params);

  // Do query.

  try {
    $headers = array();
    $headers[] = 'Cache-Control: no-cache';

    $process = curl_init($url);

    curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
    curl_setopt($process, CURLOPT_TIMEOUT, 15); // time in seconds.
    curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);

    $response = curl_exec($process);

    curl_close($process);

    if (is_json($response)) {
      return json_decode($response);
    }
    else {
      return FALSE;
    }
  }
  catch (Exception $e) {
    return FALSE;
  }
}

/**
 * Check json integrity.
 */

function is_json($string) {

  json_decode($string);

  return (json_last_error() == JSON_ERROR_NONE);
}

Después de haber utilizado este módulo en un proyecto real hemos visto que el potencial de este módulo es muy grande de cara a hacer aplicaciones móvil a partir de una web ya existente. No obstante, vemos que hay dos puntos clave que tendrían que mejorar para ser perfecto:

  • Implementar el deep load: por ejemplo, cuando cargas un artículo verás que tiene asociada la taxonomía 11, pero si quieres más información como por ejemplo el título de esta taxonomía, tendrás que hacer una llamada remota adicional. En drupal.org hay varias incidencias que hablan del tema, pero en ningún sitio hay instrucciones claras de cómo conseguirlo. Creemos que tendría que venir de serie porque de cara al rendimiento es clave (ver captura de pantalla).
  • Permitir hacer filtrajes múltiples sobre un mismo campo: por ejemplo, para poder listar eventos que se encuentran entre dos fechas.

Módulo restWS Drupal

Comparte este artículo

Artículos Relacionados