logo

Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

Creazione di nuove risorse (POST)

04/09/2025, by Ivan

Questa pagina mostra esempi di varie richieste POST per il modulo JSON:API.

Le richieste POST vengono utilizzate per creare nuove risorse. Se hai bisogno di modificare risorse, devi usare PATCH.

La specifica JSON:API (e quindi il modulo JSON:API) supporta la creazione di una sola risorsa per richiesta POST. Per Drupal, ciò significa che non è possibile (con questo modulo da solo) creare più entità in una singola richiesta. Potresti volerlo fare se desideri creare entità referenziate contemporaneamente a un’entità padre. Anche se JSON:API non può supportare questo comportamento, moduli come Subrequests possono aiutare con tali esigenze.

Abilitare l’operazione di creazione

Visita /admin/config/services/jsonapi
e seleziona l’opzione "Accetta tutte le operazioni di creazione, lettura, aggiornamento ed eliminazione JSON:API".

Create, Read, Update, Delete methods
Abilita Crea, Leggi, Aggiorna, Elimina

Autenticazione

Di solito, per le richieste POST viene utilizzata una forma di autenticazione. Gli esempi seguenti utilizzano tutti l’Autenticazione di Base con il nome utente e la password di un utente esistente nel sito che ha il permesso di creare il contenuto indicato.

Abilita il modulo HTTP Basic Authentication (basic_auth), imposta il permesso per l’utente (e il ruolo) dell’API e aggiungi il nome utente e la password codificati nell’intestazione della richiesta 'Authorization'.

L’intestazione di esempio in questa pagina richiede un utente Drupal con nome utente 'api' e password 'api'.

Intestazioni

Le seguenti intestazioni sono obbligatorie in tutte le richieste POST per ottenere una corretta richiesta e risposta JSON:API.

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

L’intestazione seguente è necessaria affinché gli esempi funzionino:

  • Authorization: Basic YXBpOmFwaQ==

Curl

Supponiamo che i tuoi dati siano nel file 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

Richiesta POST di base

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

Corpo della richiesta

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "Il mio titolo personalizzato",
      "body": {
        "value": "Valore personalizzato",
        "format": "plain_text"
      }
    }
  }
}

Risposta

Risposta HTTP 201 (Creato). Il corpo della risposta contiene la risposta JsonApi dell’entità creata.

Richiesta POST con relazioni

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

I campi di riferimento a entità devono essere impostati come relationships e non come attributes. Se non lo fai, vedrai il messaggio di errore "I seguenti campi di relazione sono stati forniti come attributi" seguito da un elenco di campi con questo problema.

La chiave id deve contenere l’UUID, non l’ID, dell’entità; esempio: faba301b-bdf5-4658-abc1-e173b815984f.

Corpo della richiesta

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "Articolo da admin",
      "body": {
        "value": "Valore personalizzato",
        "format": "plain_text"
      }
    },
    "relationships": {
      "uid": {
        "data": {
          "type": "user--user",
          "id": "{{UUID dell'utente 1}}"
        }
      },
      "field_taxonomy_term_reference": {
        "data": {
          "type": "taxonomy_term--{{bundle}}",
          "id": "{{UUID del termine}}"
        }
      }
    }
  }
}

Risposta

Risposta HTTP 201 (Creato). Il corpo della risposta contiene la risposta JsonApi dell’entità creata.

Metodo POST utilizzando Rest API 

Crea prima un modulo personalizzato con la risorsa rest e abilitalo navigando in /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;

/**
 * Fornisce una risorsa per creare nodi.
 *
 * @RestResource(
 *   id = "rest_resource_post_example",
 *   label = @Translation("Esempio Rest Resource Post"),
 *   uri_paths = {
 *     "create" = "/rest/api/post/node-create"
 *   }
 * )
 */
class RestResourcePostExample extends ResourceBase {

  use StringTranslationTrait;

  /**
   * Un’istanza dell’utente corrente.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $currentUser;

  /**
   * Costruisce un oggetto Drupal\rest\Plugin\ResourceBase.
   */
  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')
    );
  }

  /**
   * Risponde alle richieste POST.
   *
   * Crea un nuovo nodo.
   */
  public function post($data) {

    // Usa l’utente corrente dopo l’autenticazione per validare l’accesso.
    if (!$this->currentUser->hasPermission('administer site content')) {

      // Mostra la pagina di accesso negato predefinita.
      throw new AccessDeniedHttpException('Accesso negato.');
    }

    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 salvato!\n", ['@nid' => $node->id()]));

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

    }

    $message = $this->t("Nuovi nodi creati con nids : @message", ['@message' => implode(",", $nodes)]);

    return new ResourceResponse($message, 200);

  }

}

Dati JSON di esempio per creare nodi:

[
    {
        "nodetype": "article",
        "title": "Formazione",
        "body": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien..."
    },
    {
        "nodetype": "page",
        "title": "Team Building",
        "body": "Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat..."
    },
    {
        "nodetype": "article",
        "title": "Servizi",
        "body": "Proin interdum mauris non ligula pellentesque ultrices..."
    },
    {
        "nodetype": "page",
        "title": "Gestione del prodotto",
        "body": "Cras mi pede, malesuada in, imperdiet et, commodo vulputate..."
    },
    {
        "nodetype": "article",
        "title": "Sviluppo aziendale",
        "body": "Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum..."
    }
]

Comando Curl per effettuare una richiesta 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

Articolo da Documentazione di Drupal.