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:
/comment
/file
/node
/taxonomy_term
y /taxonomy_vocabulary
/user
También ofrece hooks para agregar nuevas rutas mediante hook_services_resources
.
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
Opcionalmente si posee drush puede simplificar el proceso usando los siguientes comandos
drush dl services
drush en services
drush en rest_server
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:
En structure/services procedemos a editar nuestro servicio creado usando el botón de Edit Resources
Activamos los resources a utilizar, probaremos con node usando index y retrieve.
De esta manera ya tenemos un REST API funcional.
En la pestaña de SERVER podemos configurar los formatos aceptados y de respuesta, las opciones disponibles son:
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."
En este momento ya debe de ser posible obtener la lista de nodos mediante el endpoint test/node
.
Es útil saber que podemos especificar el formato de la respuesta agregando la extensión por ejemplo:
Es posible obtener un nodo especifico usando el endpoint test/node/id
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.
En la pestaña de EDIT marcamos el checkbox HTTP basic authentication y guardamos
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.
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=