logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builderâť—

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

âť—Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri

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.