
Drupal 8: Creando un recurso REST personalizado con un método PATCH
Autor: fjavimartin
Fecha de Creación: 21/05/2019
Categorías:
El objetivo de este artículo será la creación de un recurso REST con un endpoint que gestionará solicitudes PATCH mediante las que se actualizará el título del nodo cuyo identificador se pasará en la solicitud http.
1. Actualización fichero routing.yml
El primer paso será añadir la nueva ruta a nuestro fichero routing.yml:
drupal_miseries.customrestpatch:
path: '/drupal_miseries/rest/customrestpatch'
defaults:
_controller: '\Drupal\drupal_miseries\Rest\CustomRest::updateNode'
methods: [PATCH]
requirements:
_access: 'TRUE'
Poco hay que explicar en este fragmento de código:
- Añadimos el path en el que escuchará nuestro endpoint
- Función del controlador CustomRest que gestionará las solicitudes.
- Método que escuchará nuestro endpoint.
- Dejaremos abierto el acceso a nuestro endpoint.
2. Método updateNode
El método para actualizar el título muy sencillo:
/**
* Update node title.
* @param Request $request
* @return \Symfony\Component\HttpFoundation\JsonResponse
*/
public function updateNode(Request $request) {
$storage = $this->entityTypeManager->getStorage('node');
// Get data value from request
$data = $request->request->get('data');
// Transform json from request to associative array
$values = json_decode($data, TRUE);
// Try to load node
$node = $storage->load($values['nid']);
// If node exist update title and return OK message
if (!empty($node)) {
// Set new title and save node
$node->setTitle($values['title']);
$node->save();
//Create response with OK message
$response = new JsonResponse([
'response' => 'Node updated.'
]);
} else {
// If node not exists return error message
$response = new JsonResponse([
'response' => 'Node not exists.',
], 404);
}
// Return response
return $response;
}
Recuperamos el parámetro nid que recibimos en la solicitud y lo utilizamos para intentar cargar el nodo que corresponda. Si podemos recuperar el nodo actualizamos su título, lo salvamos y cargamos en la respuesta un mensaje de OK. Para el caso que no podamos cargar el nodo simplemente notificamos que el nodo no existe.
3. Probando nuestro endpoint UPDATE
Para probar el endpoint que acabamos de crear, como en anteriores artículos, utilizaré la herramienta postman.
Los datos json con los parámetros que pasaremos a nuestro método será:
{
"nid": 195,
"title": "New Node title"
}
La solicitud completa http será muy parecida a la siguiente:
PATCH /drupal8/drupal_miseries/rest/customrestpatch HTTP/1.1
Host: mihost
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: 331f8c09-2c06-d3b1-f2b7-29314bfc3529
data=%7B%0A++%22nid%22%3A+195%2C%0A++%22title%22%3A+%22New+Node+title%22%0A%7D
Una vez ejecutada la solicitud y si todo ha ido bien recibiremos la siguiente respuesta:
{
"response": "Node updated."
}
Para el caso en el que no hayamos encontrado ningún nodo que se corresponda con el nid que le pasamos en los parámetros el mensaje de respuesta será:
{
"response": "Node not exists."
}
Mientras hacía este tutorial he visto que con Content-Type: multipart/form-data no podía recuperar los valores introducidos en el json de la solicitud mediante el objeto request de symfony, sin embargo, utilizando Content-Type: application/x-www-form-urlencoded funcionaba correctamente. No tengo muy claro como influye esta modificación en una solicitud GET o UPDATE, pero con la primera funciona correctamente y no con la segunda. Si alguno de vosotros conoce los motivos ......no lo dudéis y añadir esta información en los comentarios.
Conclusiones
Continuamos avanzando en el desarrollo de web services en drupal y ya sabemos cómo realizar consultas, crear objetos y actualizarlos. En el próximo artículos os mostraré como eliminar objetos implementando un método que escuche solicitudes DELETE para cerrar el ciclo.
No seáis impacientes y como siempre.......Disfrutar!!!!!!!
Referencias
https://www.drupal.org/docs/8/core/modules/rest/4-patch-for-updating-content-entities
https://www.e-quipos.es/blog/drupal-8-creando-un-recurso-rest-personalizado-con-un-m%C3%A9todo-get
https://www.e-quipos.es/blog/drupal-8-creando-un-recurso-rest-personalizado-con-un-metodo-post
https://symfony.com/doc/current/introduction/http_fundamentals.html
https://symfony.com/doc/current/components/http_foundation.html