Y en mis tiempos libres:
Mas sobre mi y contacto: www.nachodigital.com.ar
En resumen, poder exponer los datos de
Drupal de otra manera: JSON, XML, otros...
Drupal 7
Drupal 8
Para Drupal7 también existe otro módulo llamado
RESTful Web Services, pero no es tan usado.
Mucho de lo que nos dan solo necesita
configuración y un poco de conocimientos generales
de Drupal y su estructura de datos.
Resumiendo:
Articulos:
drush dl -y services ; drush en -y services rest_server
drush dl -y services_entity ; drush en -y services_entity
drush dl -y libraries ; drush en -y libraries
El REST server viene con el módulo services, pero si queremos SOAP debemos bajar el módulo SOAP Server
Structure -> Services
admin/structure/services/list/myservice/resources
"Choose which authentication schemes that should be used with your endpoint. If no authentication method is selected all requests will be done by an anonymous user."
Esto significa que el usuario que hace el pedido es annonymous para Drupal. Por lo tanto los permisos sobre nodos (en este caso) nos van a afectar.
Una alternativa será usar Basic Auth y otra hacer un login via REST service.
/admin/people/permissions
Drupal service's docs: Working with REST Server
(agregados a Firefox)
GET http://misitio.com/api/node/13.json
GET http://misitio.com/api/node
JSON data: {"title":"Mi nodo via REST","type":"page",...}
IMPORTANTE: ¡Ser anónimo! (private window => no logueado)
Usamos el módulo devel
Usamos el módulo Services Basic Authentication
Pasos:
Configurar headers:
(módulo que extiende services)
Nos permite extenter los servicios
a cualquier tipo de entidad:
Incluso extensiones como field collection
Como lo hacemos:
Implementamos hook_services_resources():
function myintegration_services_resources() {
$items = array(
'report' => array(
'operations' => array(
'create' => array(
'help' => 'Creating Report',
'callback' => '_create_report',
'access callback' => 'user_access',
'access arguments' => array('access content'),
'access arguments append' => FALSE,
'args' => array(
array(
'name' => 'report_data',
'type' => 'array',
'description' => 'Submited Report Details',
'source' => 'data',
'optional' => FALSE,
),
),
),
),
),
);
return $items;
}
Implementamos la funcion que maneja el servicio:
function _create_report($report_data) {
$server_info = services_server_info_object();
if (!empty($server_info->debug)) {
watchdog('MiServicio', 'Gotten data = @report_data
',array('@report_data' => print_r($report_data, TRUE)),WATCHDOG_DEBUG);
}
// Make sure we got the report data
if(empty($report_data)) {
watchdog('MiServicio', 'No data sent!',NULL,WATCHDOG_WARNING);
return array("response"=>"Failed, missing report data.");
}
// Create a new node to store report information
$new_node = new stdClass();
$new_node->type = "report";
// Continua...
Como debe terminar mi servicio:
// Continuando...
if (!empty($server_info->debug)) {
watchdog('MiServicio', 'Updated node = @new_node
',array('@new_node' => print_r($new_node, TRUE)),WATCHDOG_DEBUG);
}
// Devolvemos el resultado del servicio
if ($new_node->nid) {
return array("response"=>"Ok","status"=>"200","node"=>$new_node->nid,"fc"=>$field_collection_item->item_id);
}
else
return array("response"=>"Failed");
}
Ejemplo completo:
Instalando:
Nuestro servicio dentro de "Services":
Referencias:
drush en -y hal rest serialization basic_auth
drush dl -y restui ; drush en -y restui
Se puede trabajar configurando manualmente
el archivo ARCHIVO!!, pero gracias a RESTui
podemos trabajar como en D7.
Configuration -> Web services -> REST
People -> Permissions
URL: http://drupal8.local//node/3?_format=json
Resultado: drupal8_Services_node_GET_response.json
Por ahora la única forma "fácil" es
crear el resource via código.
Esto no anda bien en D8, debería andar en la versión 8.1. Hay formas de usarlo hoy, pero todavía estoy juntando información del como. Cuando logre tener detalles los compartiré en mi blog: www.nachodigital.com.ar/es/articles
Usando Drupal Console:
drupal generate:service [options]
Para mas detalles visitar la documentación: generate:service
Articulos:
Headless Drupal: