logo

Paleta de lienzo: 隆Hazlo colorido!馃帹

Palette - Constructor visual de p谩ginas, no se requiere t铆tulo en dise帽o.

Demo en vivo Descargar Palette

Scroll

Creaci贸n de nuevos recursos (POST)

18/05/2025, by Ivan

Esta p谩gina muestra ejemplos de varias solicitudes POST para el m贸dulo JSON:API.

Las solicitudes POST se utilizan para crear nuevos recursos. Si necesitas modificar recursos, debes utilizar PATCH.

La especificaci贸n JSON:API (y, por lo tanto, el m贸dulo JSON:API) solo admite la creaci贸n de un recurso por solicitud POST. Para Drupal, esto significa que no es posible (con solo este m贸dulo) crear varias entidades en una sola solicitud. Es posible que desees hacer esto si quieres crear entidades referenciadas al mismo tiempo que una entidad principal. Mientras que JSON:API no puede soportar ese comportamiento, m贸dulos como Subrequests pueden ayudar con estos requerimientos.

Habilitar la operaci贸n de creaci贸n

Visita /admin/config/services/jsonapi
y marca la opci贸n "Aceptar todas las operaciones de crear, leer, actualizar y eliminar de JSON:API".

Create, Read, Update, Delete methods
Habilitar Crear, Leer, Actualizar, Eliminar m茅todos

Autenticaci贸n

Normalmente se usa alg煤n tipo de autenticaci贸n para las solicitudes POST. Todos los ejemplos a continuaci贸n usan Autenticaci贸n B谩sica utilizando el nombre de usuario y la contrase帽a de un usuario existente en el sitio que tenga permiso para crear el contenido.

Habilita el m贸dulo de Autenticaci贸n B谩sica HTTP (basic_auth), asigna el permiso adecuado al usuario de la API (y su rol), y configura el nombre de usuario y contrase帽a codificados en el encabezado 'Authorization' de la solicitud.

El encabezado de ejemplo en esta p谩gina requiere un usuario de Drupal con nombre de usuario 'api' y contrase帽a 'api'.

Encabezados

Los siguientes encabezados son obligatorios en toda solicitud POST para obtener una respuesta adecuada de JSON:API:

  • Accept: application/vnd.api+json
  • Content-Type: application/vnd.api+json

El siguiente encabezado tambi茅n es necesario para que los ejemplos funcionen:

  • Authorization: Basic YXBpOmFwaQ==

Curl

Sup贸n que tus datos est谩n en el archivo payload.json.

curl \
    --user api:api \
    --header 'Accept: application/vnd.api+json' \
    --header 'Content-type: application/vnd.api+json' \
    --request POST http://drupal.d8/jsonapi/node/article \
    --data-binary @payload.json

Solicitud POST b谩sica

URL: http://example.com/jsonapi/node/article

Cuerpo de la solicitud

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "Mi t铆tulo personalizado",
      "body": {
        "value": "Valor personalizado",
        "format": "plain_text"
      }
    }
  }
}

Respuesta

Respuesta HTTP 201 (Created). El cuerpo de la respuesta contiene la respuesta JsonApi de la entidad creada.

Solicitud POST con relaciones

URL: http://example.com/jsonapi/node/article

Los campos de referencia a entidades deben configurarse como relationships y no como attributes. Si no haces esto, ver谩s el mensaje de error "The following relationship fields were provided as attributes" seguido de una lista de campos con este problema.

La clave id debe contener el UUID, no el ID, de la entidad; ejemplo: faba301b-bdf5-4658-abc1-e173b815984f.

Cuerpo de la solicitud

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "Art铆culo por admin",
      "body": {
        "value": "Valor personalizado",
        "format": "plain_text"
      }
    },
    "relationships": {
      "uid": {
        "data": {
          "type": "user--user",
          "id": "{{UUID del usuario 1}}"
        }
      },
      "field_taxonomy_term_reference": {
        "data": {
          "type": "taxonomy_term--{{bundle}}",
          "id": "{{UUID del t茅rmino}}"
        }
      }
    }
  }
}

Respuesta

Respuesta HTTP 201 (Created). El cuerpo de la respuesta contiene la respuesta JsonApi de la entidad creada.

M茅todo POST usando la Rest API

Primero crea un m贸dulo personalizado con el recurso REST y habil铆talo navegando a /admin/config/services/rest

<?php

namespace Drupal\rest_examples\Plugin\rest\resource;

use Drupal\node\Entity\Node;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
use Drupal\Core\Session\AccountProxyInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;

/**
 * Proporciona un recurso para publicar nodos.
 *
 * @RestResource(
 *   id = "rest_resource_post_example",
 *   label = @Translation("Ejemplo de recurso Rest Post"),
 *   uri_paths = {
 *     "create" = "/rest/api/post/node-create"
 *   }
 * )
 */
class RestResourcePostExample extends ResourceBase {

  use StringTranslationTrait;

  /**
   * Una instancia del usuario actual.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $currentUser;

  /**
   * Constructor de Drupal\rest\Plugin\ResourceBase.
   *
   * @param array $configuration
   * @param string $plugin_id
   * @param mixed $plugin_definition
   * @param array $serializer_formats
   * @param \Psr\Log\LoggerInterface $logger
   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, array $serializer_formats, LoggerInterface $logger, AccountProxyInterface $current_user) {

    parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger);

    $this->currentUser = $current_user;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->getParameter('serializer.formats'),
      $container->get('logger.factory')->get('rest_examples'),
      $container->get('current_user')
    );
  }

  /**
   * Responde a solicitudes POST.
   *
   * Crea un nuevo nodo.
   *
   * @param mixed $data
   *   Datos para crear el nodo.
   *
   * @throws \Symfony\Component\HttpKernel\Exception\HttpException
   *   Lanza excepci贸n esperada.
   */
  public function post($data) {

    // Utiliza el usuario actual tras pasar la autenticaci贸n para validar acceso.
    if (!$this->currentUser->hasPermission('administer site content')) {
      // Muestra la p谩gina predeterminada de acceso denegado.
      throw new AccessDeniedHttpException('Acceso denegado.');
    }

    foreach ($data as $key => $value) {

      $node = Node::create(
        [
          'type' => $value['nodetype'],
          'title' => $value['title'],
          'body' => [
            'summary' => '',
            'value' => $value['body'],
            'format' => 'full_html',
          ],
        ]
      );

      $node->enforceIsNew();
      $node->save();

      $this->logger->notice($this->t("隆Nodo con nid @nid guardado!\n", ['@nid' => $node->id()]));

      $nodes[] = $node->id();

    }

    $message = $this->t("Nuevos nodos creados con nids: @message", ['@message' => implode(",", $nodes)]);

    return new ResourceResponse($message, 200);

  }

}

Datos JSON de ejemplo para crear nodos:

[
    {
        "nodetype": "article",
        "title": "Formaci贸n",
        "body": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.\n\nEtiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.\n\nPraesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio."
    },
    {
        "nodetype": "page",
        "title": "Trabajo en equipo",
        "body": "Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.\n\nPraesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.\n\nMorbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem."
    },
    {
        "nodetype": "article",
        "title": "Servicios",
        "body": "Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.\n\nAenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.\n\nCurabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est."
    },
    {
        "nodetype": "page",
        "title": "Gesti贸n de productos",
        "body": "Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n\nProin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.\n\nAenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum."
    },
    {
        "nodetype": "article",
        "title": "Desarrollo de negocios",
        "body": "Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.\n\nMorbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.\n\nFusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem."
    }
]

Comando Curl para realizar una solicitud POST:

curl \
    --user uname:password \
    --header 'Accept: application/json' \
    --header 'Content-type: application/json' \
    --request POST http://example.com/rest/api/post/node-create \
    --data-binary @post_data.json

Art铆culo de la Documentaci贸n de Drupal.