Publicación de contenidos en Drupal 8.2 con RESTful Web services

Enviado por Juan el Mar, 29/11/2016 - 16:17
Old typewriting machine

He decidido escribir esta entrada porque en días pasados me di a la tarea de explorar el módulo RESTful de Drupal 8 para publicar contenidos desde una fuente externa y me encontré con una situación que se tornó confusa, esto a pesar de que ya hay varios tutoriales y documentación al respecto en Internet, que sin embargo pueden haberse vuelto obsoletos en cierta medida dado que el módulo de RESTful se está transformando constantemente (tal como lo indica el mismo Dries Buytaert en su propio sito). En particular hablo de la versión de Drupal 8.2.3 para registrar un nuevo nodo a través del método POST; no abordaré la obtención de datos con el método GET porque esa resultó una tarea más sencilla para lo cual la documentación existente ya referida ha resultado bastante útil.

Lo primero es activar los siguientes módulos que ya vienen incluidos como parte del core:

  • RESTful Web Services
  • HAL
  • HTTP Basic Authentication
  • Serialization

Y para facilitarnos la vida y no enredarnos trabajando con los archivos YAML de configuración, instalar el módulo contribuido:

  • REST UI

Ahora hay que crear una cuenta de usuario que se utilizará en la autenticación del servicio web. Esta cuenta debe tener permisos para ver y crear contenidos nuevos del tipo que crearemos a través de REST. Esto último es algo que cambió en las recientes actualizaciones del core, ya que antes había que asignar permisos por acción (GET, POST, PATCH o DELETE) en la sección REST Web Services de los permisos de Drupal.

Lo que sigue es activar las acciones REST para los recursos que nos interesan y para eso vamos a Configuración / REST o dicho de otro modo, http://tusitio.com/admin/config/services/rest.

Por defecto ya está activado el recurso de Contenido con el patrón de ruta /node/{node}. Damos clic en la opción Editar de este recurso y activamos POST con el format hal_json y el proveedor de autenticación basic_auth:

Configuración del módulo REST UI

Ahora le pediremos a Drupal una última cosa antes de pasarnos a la parte del cliente: un token de autenticación X-CSRF. Esto se lo pedimos abriendo en el navegador la siguiente dirección:

http://tusitio.com/rest/session/token

Lo cual te arrojará una cadena hash parecida a la siguiente que deberás copiar al portapapeles, ya que lo vas a necesitar en la parte del cliente:

BB7-E8HR2E9JHSSq2ggfdDdyIJC369MVGbE4AgbNHdI

Con esto debería estar listo todo de parte de Drupal para echar a andar las peticiones vía REST. Para probar la integración, utilizaré Postman, aunque esto se puede hacer ya por cualquier otro cliente o script para efectuar la petición por HTTP.

La dirección a la que debemos apuntar debe coincidir con el patrón de URL que nos indicaba en la configuración de REST para el recurso Contenido, es decir: http://tusitio.com/entity/node?_format=hal_json. Como lo que nos interesa es crear un nuevo contenido, debemos elegir el método POST.

Una ventaja de utilizar Postman es que te genera la cadena encriptada que utilizará para conectarse. Otra alternativa es generar esta cadena por algún otro medio, codificando en base 64 el usuario y la contraseña del usuario de la cuenta de usuario de Drupal en formato usuario:contraseña.

Postman autorización

En los encabezados mandaremos application/hal+json para las claves Content-Type y Accept. Los otros dos encabezados que nos interesan son X-CSRF-TOKEN cuyo valor es el token que habíamos guardado en el portapapeles, y Authorization Basic seguido del hash base 64 del usuario y contraseña:

Encabezados Postman

Y como cuerpo de la petición, mandamos un Ajax con los datos del nodo que queremos agregar y el tipo de contenido del mismo:

{
	"_links": {
		"type": {
			"href": "http://fischer.dev:81/rest/type/node/article"
		}
	},
	"title": [
		{
			"value":"Título del nodo"
		}
	],
	"body": [
		{
			"value":"Cuerpo del nodo."
		}
	]
}

Esta es otra parte que ha cambiado a lo largo de la evolución de Drupal 8 y que por consiguiente en la documentación y los distintos tutoriales que hay en la red. Si no utilizamos la estructura correcta, nuestra petición nos arrojará errores y no funcionará.

Damos clic en el botón Send en Postman y recibiremos un estatus 201 Created, así como un documento JSON con la información del nodo recién creado. Si la respuesta es un mensaje vacío o un estatus 403 Forbidden, vale la pena revisar los permisos del usuario que estás utilizando para la autenticación y la estructura del JSON que estás mandando, especificando correctamente el tipo de contenido que deseas generar.