---
url: 'https://metadrop.net/en/articles/crear-una-api-en-drupal-7-con-el-modulo-restful'
title: 'Crear una API en Drupal 7 con el módulo RESTful'
author: 'Omar Lopesino'
date: '2017-05-01T09:11:46+00:00'
updated: '2026-08-04T08:01:13+00:00'
type: article
summary: 'Mediante RESTful y Drupal podremos crear una API con la información de nuestro sitio para que puedan utilizarla aplicaciones externas.'
tags:
  - 'Drupal 7'
  - 'REST API'
  - 'Content types'
published: true
og:
  determiner: Automatic
  site_name: Metadrop
  'image:alt': 'Crear una API en Drupal 7 con el módulo RESTful'
  street_address: 'Calle Manuel Luna, 12, 3 Dcha'
  locality: Madrid
  region: Madrid
  postal_code: '28020'
  country_name: España
  email: hola@metadrop.net
  phone_number: '910053180'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      '@type': Article
      '@id': 'https://metadrop.net/en/articles/crear-una-api-en-drupal-7-con-el-modulo-restful#article'
      name: 'Crear una API en Drupal 7 con el módulo RESTful'
      headline: 'Crear una API en Drupal 7 con el módulo RESTful'
      description: "Mediante RESTful\_y Drupal podremos crear una API con la información de nuestro sitio para que puedan utilizarla aplicaciones externas."
      about:
        - 'Drupal 7'
        - 'REST API'
        - 'Content types'
      datePublished: '2017-08-10T10:11:46+0200'
      dateModified: '2026-08-04T10:01:13+0200'
      author:
        '@type': Person
        name: 'Omar Lopesino'
      publisher:
        '@type': Organization
        '@id': 'https://metadrop.net/#organization'
      mainEntityOfPage: 'https://metadrop.net/en/articles/crear-una-api-en-drupal-7-con-el-modulo-restful'
    -
      '@type': Organization
      '@id': 'https://metadrop.net/#organization'
      url: 'https://metadrop.net/'
      name: Metadrop
      sameAs:
        - 'https://www.drupal.org/metadrop'
        - 'https://twitter.com/metadrop'
        - 'https://asociaciondrupal.es/partner/metadrop'
        - 'https://www.linkedin.com/company/metadrop'
      logo:
        '@type': ImageObject
        url: 'https://metadrop.net/themes/custom/mdrop_radix/logo-metadrop-500-500.jpg'
        width: '500'
        height: '500'
    -
      '@type': ItemPage
      '@id': 'https://metadrop.net/en/articles/crear-una-api-en-drupal-7-con-el-modulo-restful'
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Home
            item: 'https://metadrop.net/en'
          -
            '@type': ListItem
            position: 2
            name: 'Expert Drupal & Tech Articles'
            item: 'https://metadrop.net/en/articles'
      publisher:
        '@type': Organization
        '@id': 'https://metadrop.net/#organization'
---
 1. [Articles](https://metadrop.net/en/articles)
 
  

# Crear una API en Drupal 7 con el módulo RESTful

Thursday, August 10, 2017

 

 



Mediante RESTful y Drupal podremos crear una API con la información de nuestro sitio para que puedan utilizarla aplicaciones externas.



   



Vamos a ver cómo podemos crear una API en Drupal con el módulo [RESTful](https://www.drupal.org/project/restful), usando la versión 2.x.

El módulo RESTful tiene las siguientes ventajas respecto a otros módulos que también permiten crear servicios:

- **Versiones**: cada endpoint que creemos puede tener diferentes versiones y coexistir con las anteriores. Esto facilita el mantenimiento a la hora de tener que hacer cambios y no provocar problemas de compatibilidad con los usuarios de la API.
- **API** para manejo de entidades.
- El código del módulo está **muy orientado a objetos**. Además, utiliza el módulo [Plug](https://www.drupal.org/project/plug) para crear cada servicio, por lo que el código será más sencillo de mantener.

Como ejemplo crearemos un servicio que liste los nodos de tipo página de nuestra web.

Para empezar, necesitaremos instalar RESTful en nuestro Drupal. Hay que tener en cuenta que la versión de PHP mínima para tener RESTful es la 5.5.9.

En el módulo donde vayamos a codificar el servicio debemos añadir estas líneas en el .info:

```plaintext
...
registry_autoload[] = PSR-4

```

De esta forma diremos que queremos autocargar clases con [PSR-4](https://www.php-fig.org/psr/psr-4/).

Ahora, empezaremos con la clase que represente al servicio. Debemos crearla en una carpeta que se llame *src/Plugin/resource* , ya que es la que establece RESTful para declarar los servicios REST.

**src/Plugin/resource/Page\_\_1\_0.php**

```php
<?php

namespace Drupal\my_module\Plugin\resource;

use Drupal\restful\Plugin\resource\ResourceNode;

/**
 * Class Page__1_0.
 *
 * @Resource(
 *   name = "page:1.0",
 *   resource = "page",
 *   label = "Page",
 *   description = "Node page endpoint.",
 *   authenticationTypes = {
 *     "cookie"
 *   },
 *   dataProvider = {
 *     "entityType": "node",
 *     "bundles": {
 *       "page"
 *     },
 *     "idField": "id"
 *   },
 *   authenticationOptional = TRUE,
 *   majorVersion = 1,
 *   minorVersion = 0,
 * )
 */
class Page__1_0 extends ResourceNode {

  /**
   * {@inheritdoc}
   */
  public function publicFields() {
    $fields = parent::publicFields();
    $fields['body'] = array(
      'property' => 'body',
      'sub_property' => 'value',
    );
    return $fields;
  }
}
```

El archivo acaba en \_\_1\_0 para poder indicar la versión 1.0.

En el código podemos apreciar lo siguiente:

- Extendemos de la clase **ResourceNode**, clase base para crear servicios sobre tipos de contenido.
- Usamos la anotación **@Resource** para indicar que esta clase corresponde a un servicio. Las variables más importantes son: 
    - **resource:** ruta del servicio.
    - **majorVersion**.
    - **minorVersion**.
    - **name**: nombre completo del servicio. Debe seguir este patrón: **resource:majorVersion.minorVersion**.
    - **dataProvider**: aquí indicamos el tipo de entidad que queremos mostrar (nodos) y su tipo (página). Si quisiéramos añadir otro tipo de entidad solo deberíamos cambiar la propiedad **entityType**.
- Con la información de la anotación sabemos que la ruta será **/api/v1.0/page**.
- En la clase sobreescribimos el método **publicFields** el cual nos permite añadir todos los campos que necesitemos en el servicio. Nosotros añadimos el campo **body** (property) y la propiedad **value** (sub\_property) bajo el nombre de **body** (clave del array, podemos poner cualquiera). Todos los campos que queramos los podemos consultar en la gestión de campos del tipo de contenido en concreto. También tendremos otros campos que se añaden por defecto: el título del nodo (**label**), el identificador(**id**) y la ruta al servicio para el nodo en concreto (**self**).

Con esto ya tendremos listo nuestro servicio, en **/api/v1.0/page**. Este servicio también permitirá crear, editar y borrar contenido (si el usuario que lo pide tiene los permisos adecuados).

Si consultamos el servicio desde el mismo navegador veremos lo siguiente.

```json
{
  "data": [
    {
      "id": 1,
      "label": "Example",
      "self": "http://drupal-modules.me/api/v1.0/page/1",
      "body": "<p>Example</p> "
    },
    {
      "id": 2,
      "label": "Example 2",
      "self": "http://drupal-modules.me/api/v1.0/page/2",
      "body": "<p>Example 2</p> "
    }
  ],
  "count": 2,
  "self": {
    "title": "Self",
    "href": "http://drupal-modules.me/api/v1.0/page"
  }
}
```

Tendremos todos nuestros nodos de tipo página recopilados en **data**, con los campos que necesitamos.

La estructura del JSON viene formada de esta forma ya que RESTful ofrece diferentes formatos para la respuesta del servicio, en este caso partimos del formato **Simple JSON**. Si quisiéramos cambiar el formato lo podemos hacer en **Configuración &gt; Servicios web &gt; Restful**, cambiando el campo **Default Formatter**.

Con esto ya tenemos un servicio REST en nuestro Drupal disponible para ser consumido por cualquier aplicación externa.



[Drupal 7](https://metadrop.net/en/articles?text=Drupal%207)

[REST API](https://metadrop.net/en/articles?text=REST%20API)

[Content types](https://metadrop.net/en/articles?text=Content%20types)

 

- Omar Lopesino
    
    Senior Drupal developer
 
[Module development and third-party integrations with Drupal](https://metadrop.net/en/services/drupal/integrations " See Module development and third-party integrations with Drupal")

Metadrop connects Drupal to your CRM, ERP, payment, and marketing stack — Salesforce, Microsoft Dynamics, BBVA virtual POS, Workday, and Keepeek — with custom modules and secure, GDPR-compliant APIs.

 

 See more