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

Nieuwe resources aanmaken (POST)

04/09/2025, by Ivan

Deze pagina toont voorbeelden van verschillende POST-verzoeken voor de JSON:API module.

POST-verzoeken worden gebruikt om nieuwe resources aan te maken. Als je resources wilt wijzigen, moet je ze PATCH-en.

De JSON:API-specificatie (en dus ook de JSON:API-module) ondersteunt alleen het aanmaken van één resource per POST-verzoek. Voor Drupal betekent dit dat het niet mogelijk is (met alleen deze module) om meerdere entiteiten in één verzoek aan te maken. Je zou dit bijvoorbeeld willen doen wanneer je gerelateerde entiteiten tegelijk met een hoofdentiteit wilt aanmaken. Hoewel JSON:API dit gedrag niet ondersteunt, kunnen modules zoals Subrequests hierbij helpen.

Create-operatie inschakelen

Ga naar /admin/config/services/jsonapi
en vink de optie "Alle JSON:API create-, read-, update- en delete-operaties toestaan." aan.

Create, Read, Update, Delete methods
Enable Create, Read, Update, Delete methods

Authenticatie

Gewoonlijk wordt er een vorm van authenticatie gebruikt voor POST-verzoeken. De onderstaande voorbeelden gebruiken allemaal Basic Authentication met de gebruikersnaam en het wachtwoord van een bestaande gebruiker op de website die de juiste rechten heeft om de opgegeven content aan te maken.

Schakel de HTTP Basic Authentication (basic_auth)-module in, stel de permissie in voor de API-gebruiker (en rol) en voeg de gecodeerde gebruikersnaam en het wachtwoord toe aan de 'Authorization'-header van het verzoek.

De voorbeeldheader op deze pagina vereist een Drupal-gebruiker met gebruikersnaam 'api' en wachtwoord 'api'.

Headers

De volgende headers zijn vereist voor alle POST-verzoeken om een correcte JSON:API-aanvraag en -antwoord te krijgen.

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

De volgende header is nodig om de voorbeelden te laten werken:

  • Authorization: Basic YXBpOmFwaQ==

Curl

Stel dat je data in het bestand payload.json staat.

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

Eenvoudig POST-verzoek

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

Request body

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "Mijn aangepaste titel",
      "body": {
        "value": "Aangepaste waarde",
        "format": "plain_text"
      }
    }
  }
}

Response

HTTP 201 (Created) response. De response body bevat de JsonApi-response van de aangemaakte entiteit.

POST-verzoek met relaties

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

Entity reference-velden moeten worden ingesteld als relationships en niet als attributes. Als je dit niet doet, zie je de foutmelding "De volgende relationship-velden zijn opgegeven als attributes" gevolgd door een lijst van probleemvelden.

De id-sleutel moet de UUID, niet de ID, van de entiteit bevatten; voorbeeld: faba301b-bdf5-4658-abc1-e173b815984f.

Request body

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "Artikel door admin",
      "body": {
        "value": "Aangepaste waarde",
        "format": "plain_text"
      }
    },
    "relationships": {
      "uid": {
        "data": {
          "type": "user--user",
          "id": "{{UUID van user 1}}"
        }
      },
      "field_taxonomy_term_reference": {
        "data": {
          "type": "taxonomy_term--{{bundle}}",
          "id": "{{UUID van de term}}"
        }
      }
    }
  }
}

Response

HTTP 201 (Created) response. De response body bevat de JsonApi-response van de aangemaakte entiteit.

POST-methode met Rest API 

Maak eerst een custom module met de rest resource en schakel deze in door naar /admin/config/services/rest te navigeren.

<?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;

/**
 * Biedt een resource om nodes te posten.
 *
 * @RestResource(
 *   id = "rest_resource_post_example",
 *   label = @Translation("Rest Resource Post Example"),
 *   uri_paths = {
 *     "create" = "/rest/api/post/node-create"
 *   }
 * )
 */
class RestResourcePostExample extends ResourceBase {

  use StringTranslationTrait;

  /**
   * Een instantie van de huidige gebruiker.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $currentUser;

  /**
   * Constructor voor een Drupal\rest\Plugin\ResourceBase-object.
   *
   * @param array $configuration
   *   Configuratiegegevens voor de plugin.
   * @param string $plugin_id
   *   Het plugin_id voor de plugin-instantie.
   * @param mixed $plugin_definition
   *   De plugin-implementatie.
   * @param array $serializer_formats
   *   Beschikbare serialisatieformaten.
   * @param \Psr\Log\LoggerInterface $logger
   *   Een logger-instantie.
   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
   *   De huidige gebruiker.
   */
  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')
    );
  }

  /**
   * Reageert op POST-verzoeken.
   *
   * Maakt een nieuwe node aan.
   *
   * @param mixed $data
   *   Gegevens om de node aan te maken.
   *
   * @throws \Symfony\Component\HttpKernel\Exception\HttpException
   *   Gooit een verwachte uitzondering.
   */
  public function post($data) {

    // Gebruik de huidige gebruiker na authenticatie om toegang te valideren.
    if (!$this->currentUser->hasPermission('administer site content')) {

      // Toon de standaardpagina "Access Denied".
      throw new AccessDeniedHttpException('Access Denied.');
    }

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

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

    }

    $message = $this->t("Nieuwe nodes aangemaakt met nids : @message", ['@message' => implode(",", $nodes)]);

    return new ResourceResponse($message, 200);

  }

}

JSON Voorbeelddata om nodes aan te maken:

[
    {
        "nodetype": "article",
        "title": "Training",
        "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": "Team Building",
        "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": "Services",
        "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": "Product Management",
        "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": "Business Development",
        "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."
    }
]

Curl-commando om een POST-verzoek te doen:

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

Artikel van Drupal Documentatie.