# 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](https://www.drupal.org/project/services).
El modulo [Services](https://www.drupal.org/project/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](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_18.34.18.png)
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](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_18.37.45.png)
- 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](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_18.41.58.png)
Activamos los resources a utilizar, probaremos con **node** usando index y retrieve.
![Enabling node endpoint](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_18.43.20.png)
De esta manera ya tenemos un REST API funcional.
![Services formatters](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_18.45.31.png)
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](https://cms.rootstack.com/sites/default/files/blog/img/screenshot_from_2016-02-15_185159.png)
###Index
En este momento ya debe de ser posible obtener la lista de **nodos** mediante el endpoint `test/node`.
![Testing node index](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_18.55.15.png)
Es útil saber que podemos especificar el formato de la respuesta agregando la extensión por ejemplo:
![Using JSON Format](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_18.57.58.png)
#####test/node.json
###Retrieve
Es posible obtener un nodo especifico usando el endpoint `test/node/id`
![Retrieve a single node](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_19.01.53.png)
## 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](https://cms.rootstack.com/sites/default/files/blog/img/screenshot_from_2016-02-15_190529.png)
- 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](https://cms.rootstack.com/sites/default/files/blog/img/screen_shot_2016-02-15_at_19.06.54.png)
- 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](https://cms.rootstack.com/sites/default/files/blog/img/screenshot_from_2016-02-15_192802.png)
#### Petición autenticada
![Request using auth token](https://cms.rootstack.com/sites/default/files/blog/img/screenshot_from_2016-02-15_192545.png)