Drupal::httpClient | Consumo datos externos a Drupal

Texto

Consumo datos externos a  Drupal | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

   

 A la mayoría de los que trabajamos con Drupal, en algún momento, nos habrá tocado trabajar en un proyecto, que requería que sirviéramos los datos desde Drupal, para que pudiera ser consumido desde alguna API o herramienta externa, existes múltiples formas de solucionar este problema, mediante el uso de webservices, vistas y varios módulos.

     Si quieres aprender más acerca del uso de Servicios Web en Drupal HAZ CLIC AQUI

     Pero en esta ocasión, nos vamos a referir al caso contrario, es decir, a los pasos necesarios para que podamos consumir, dentro de Drupal, la información provenientes desde una API externa. De esta manera, podremos manipular o presentar los datos, dentro de nuestro proyecto Drupal, sin la necesidad de hacernos responsables de tareas como la insercción o actualización de dichos datos.

   Cómo realizar peticiones de datos externos desde Drupal

     A partir de Drupal 8, se pueden realizar todo tipo de peticiones de datos, hacia fuentes external a Drupal, gracias al método Drupal::httpClient, incluido en el núcleo.  Este método es, simplemente, un envoltorio para que podamos trabajar con la librería de php conocida como Guzzle, que según su página oficial, "Guzzle es un cliente PHP HTTP y un framework, para crear clientes de servicios web RESTful".

     Guzzle utiliza PSR-7 como interfaz de mensajes HTTP. PSR-7 describe interfaces comunes para representar mensajes HTTP. Esto permite que Guzzle funcione con cualquier otra biblioteca que utilice interfaces de mensajes PSR-7.

     Para conocer la versión de nuestro proyecto de Drupal, podremos explorar el archivo composer.lock, y encontraremos varios datos, enlaces, definiciones relacionados con Guzzle:

{
    "name": "guzzlehttp/guzzle",
    "version": "6.5.8",
    "source": {
        "type": "git",
        "url": "https://github.com/guzzle/guzzle.git",
        "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981"
    },
//

 

     Si quiers conocer más acerca de la versión más reciente de Guzzle, HAZ CLIC AQUI

 

Consumo datos externos a  Drupal | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

   Drupal::httpClient dentro de un módulo personalizado en Drupal

     Si quieres aprender a crear un módulo personalizado HAZ CLIC AQUI

     Para disponer de una fuente de datos externa a Drupal, podremos acceder a la web Data.gov, en la que podremos encontrar un amplio catálogo de informaciones, vía CKAN, con una potente API que nos permitirá realizar, de forma segura, cualquiera de las pruebas relacionadas con nuestras peticiones.

     Vamos a echar un vistazo a algunos ejemplos usando la API de CKAN, para ver la documentación completa HAZ CLIC AQUI.

   Pasos para consumir datos externos a Drupal

     Paso 1 - Inicialización del cliente

       Antes de poder realizar cualquier tipo de petición desde Drupal, vamos a necesitar inicializar el cliente de conexión. Para ello deberíamos incluir la siguiente línea dentro de nuestro Módulo Personalizado:

$client = \Drupal::httpClient();

     Paso 2 - Definir URL de conexión

       Ahora que ya hemos inicializado el cliente, podremos añadir la url y el método que vamos a utilizar para conectarnos y extraer los datos. Para ello, tendremos que agregar una línea como la siguientes, sustituyendo la URL, en caso de utilizar otra dirección.

$client->request('GET', 'http://demo.ckan.org/api/3/action/package_list');

     Guzzle también proporciona una lista de métodos sincrónicos para realizar solicitudes, para ver la lista completa HAZ CLIC AQUI

     Paso 3 - Obtener los datos del requerimiento

       Una vez definidos el método y la url con la que vamos a realizar nuestr petición (Request), necesitaremos recolectar dicha información y guardarla, para luego procesarla, así que añadiremos la siguiente estructura:

$request = $client->get('http://demo.ckan.org/api/3/action/package_list');
$response = $request->getBody();

     Paso 4 - Envío de datos hacia la API

       Ya que hemos aprendido la forma de conectarnos y de recibir los datos, desde una fuenta externa a Drupal, vamos a realizar la prueba contraria, es decir, enviaremos alguna información, en formato JSON, hacia la fuenta externa.

$client = \Drupal::httpClient();
$request = $client->post('http://demo.ckan.org/api/3/action/group_list', [
  'json' => [
    'id'=> 'data-explorer'
  ]
]);
$response = json_decode($request->getBody());

     En el código anterior, hemos cambiado el método GET por el método POST, en client->post(), esto nos ha permitido pasar, además de la url de conexión, un array de nombre "json", compuesto por varias opciones adicionales, entre ellas el formato JSON. Guzzle se encargará de especificar la cabecera de estos datos,  'Content-Type','application/json', así como de añadir el 'json_encoding', para que todo funcione correctamente.

     Finalmente, llamaremos al método json_decode, para decodificar los datos obtenidos en nuestra respuesta.

     Para ver la lista completa de las opciones disponibles, HAZ CLIC AQUI

   Cómo autenticarnos para la conexión

     En algunos casos, necesitaremos autenticarnos, para poder obtener la información desde la fuente externa, con la que deseamos realizar la conexión. En el siguiente ejemplo, puedes ver cómo sería la autenticación para acceder a la API de GitHub.

$client = \Drupal::httpClient();
$request = $client->get('https://api.github.com/user', [
  'auth' => ['username','password']
]);
$response = $request->getBody();

   Como manipular las Excepciones

     Otro de los casos con lo que podremos encontrarnos, son las excepciones. Siempre que utilicemos Drupal::httpClient, tendremos que envolver las excepciones dentro de un bloque try/catch, para poder manejarlas.

     En el siguiente ejemplo, podrás ver cómo manejar una excepción, en un caso de login, para que se muestre en la tabla de errores de Drupal.

$client = \Drupal::httpClient();

try {
  $response = $client->get('http://demo.ckan.org/api/3/action/package_list');
  $data = $response->getBody();
}
catch (RequestException $e) {
  watchdog_exception('my_module', $e->getMessage());
}

     Puedes verificar la lista completa de las excepciones, explorando en la siguiente ubicación: 

CARPETA_RAIZ/vendor/guzzlehttp/guzzle/src/Exception

     Con esta información, podrás obtener diferentes comportamientos, al momento de trabajar con las excepciones.

     El cliente de Guzzle, utiliza un sistema  handler and middleware, para enviar sus peticiones HTTP, puedes revisar la documentación oficial, para que te permita un mayor control sobre el manejo de tus datos, conexiones y resultados.

Consumo datos externos a  Drupal | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony