Creando un REST API con Drupal Services

June 18, 2021
Creando un REST API con Drupal Services

En muchos escenarios es necesario intercambiar información entre aplicaciones mediante el uso de un API, el cual por lo general requiere de cierto esfuerzo de desarrollo, este objetivo puede ser facilmente logrado con el uso del modulo Services.

El modulo Services nos ofrece por defecto un conjunto de endpoints para varias entidades de Drupal:

  • Comentarios /comment
  • Archivos /file
  • Nodos /node
  • Taxonomías /taxonomy_term y /taxonomy_vocabulary
  • Usuarios /user

También ofrece hooks para agregar nuevas rutas mediante hook_services_resources.

Instalación

Para instalar Services puedes descargar el modulo en https://www.drupal.org/project/services e instalarlo a tu carpeta de modulos que bien puede ser sites/all/modules o sites/all/modules/contrib.

Posteriormente en la interfaz administrativa en la seccion de modulos habilitar Services y REST Server Installing services module Opcionalmente si posee drush puede simplificar el proceso usando los siguientes comandos

drush dl services
drush en services
drush en rest_server

Configuración

Antes de empezar con esta sección es necesario explicar que services trabaja con el concepto de servidores, por defecto incluye uno llamado REST Server el cual servirá para nuestros propósitos.

Procedemos a structure/services y crearemos un nuevo servicio: Services module configuration

  • Machine Name: Un nombre a asignar a nuestro servicio.
  • Server: Servidor a user en este caso REST Server.
  • Path to endpoint: La ruta al servicio.

En structure/services procedemos a editar nuestro servicio creado usando el botón de Edit Resources Services resources setup

Activamos los resources a utilizar, probaremos con node usando index y retrieve. Enabling node endpoint

De esta manera ya tenemos un REST API funcional.

Services formatters En la pestaña de SERVER podemos configurar los formatos aceptados y de respuesta, las opciones disponibles son:

  • Bencode
  • JSON
  • JSONP
  • PHP
  • XML

Probando

Para asegurarnos podemos hacer una solicitud al servicio test al URL http://localhost/test el cual debe de responder el mensaje "Services Endpoint "test" has been setup successfully." Testing setup

Index

En este momento ya debe de ser posible obtener la lista de nodos mediante el endpoint test/node.

Testing node index

Es útil saber que podemos especificar el formato de la respuesta agregando la extensión por ejemplo:

Using JSON Format

test/node.json

Retrieve

Es posible obtener un nodo especifico usando el endpoint test/node/id

Retrieve a single node

Seguridad

Se puede implementar autenticación Basica ( disponible en https://www.drupal.org/project/services_basic_auth ) o OAuth Authentication ( modulo incluido ).

Configuraremos autenticación básica:

  • Descargamos y habilitamos el modulo services_basic_auth.

    Install auth module

  • La autenticación es por servicio, procedemos a editar nuestro servicio.
  • En la pestaña de EDIT marcamos el checkbox HTTP basic authentication y guardamos

    Enable auth on service

  • La autenticación ya estará disponible y al momento de hacer un request y estar autenticado el usuario de Drupal correspondiente se cargara y podra ejecutar acciones que requieran de permisos específicos.

    Para autenticarse y hacer un request es necesario agregar el header

    Authorization: Basic {token}

El token es generado codificando 'username:password' en base64.

Probando autenticación

Crearemos un nodo pero no lo publicaremos, de este modo un usuario no autenticado no podrá verlo.

Siendo nuestro usuario test y nuestra password passw0rd procedemos a generar el token.

$token = base64_encode('admin:passw0rd')

Teniendo YWRtaW46cGFzc3cwcmQ= como token Nuestro header sera Authorization: Basic YWRtaW46cGFzc3cwcmQ=

Petición sin autenticar

Request without auth

Petición autenticada

Request using auth token