Creación de nuevos recursos (POST)
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".

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.