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
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.