Erstellen neuer Ressourcen (POST)
Diese Seite zeigt Beispiele für verschiedene POST-Anfragen für das JSON:API-Modul.
POST-Anfragen werden verwendet, um neue Ressourcen zu erstellen. Wenn du Ressourcen ändern möchtest, musst du stattdessen PATCH verwenden.
Die JSON:API-Spezifikation (und damit das JSON:API-Modul) unterstützt das Erstellen von nur einer Ressource pro POST-Anfrage. Für Drupal bedeutet das, dass es nicht möglich ist (nur mit diesem Modul), mehrere Entitäten in einer Anfrage zu erstellen. Du möchtest das vielleicht tun, wenn du referenzierte Entitäten gleichzeitig mit einer übergeordneten Entität anlegen möchtest. Während JSON:API dieses Verhalten nicht unterstützt, können Module wie Subrequests bei solchen Anforderungen helfen.
Erstellen-Operation aktivieren
Gehe zu /admin/config/services/jsonapi
und aktiviere die Option „Alle JSON:API-Operationen zum Erstellen, Lesen, Aktualisieren und Löschen akzeptieren“.

Authentifizierung
Typischerweise wird für POST-Anfragen eine Form der Authentifizierung verwendet. Alle untenstehenden Beispiele verwenden Basic Authentication mit dem Benutzernamen und Passwort eines vorhandenen Benutzers der Website, der die Berechtigung hat, den gewünschten Inhalt zu erstellen.
Aktiviere das HTTP Basic Authentication (basic_auth
)-Modul, setze die Berechtigung für den API-Benutzer (und dessen Rolle) und trage den kodierten Benutzernamen und das Passwort in den 'Authorization'-Header der Anfrage ein.
Im Beispiel-Header auf dieser Seite wird ein Drupal-Benutzer mit Benutzername 'api' und Passwort 'api' verwendet.
Header
Die folgenden Header sind erforderlich für alle POST-Anfragen, um eine korrekte JSON:API-Anfrage und -Antwort zu erhalten.
Accept: application/vnd.api+json
Content-Type: application/vnd.api+json
Folgender Header ist notwendig, damit die Beispiele funktionieren:
Authorization: Basic YXBpOmFwaQ==
Curl
Angenommen, deine Daten befinden sich in der Datei 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
Einfache POST-Anfrage
URL: http://example.com/jsonapi/node/article
Request-Body
{
"data": {
"type": "node--article",
"attributes": {
"title": "Mein eigener Titel",
"body": {
"value": "Eigener Wert",
"format": "plain_text"
}
}
}
}
Antwort
HTTP 201 (Created) Antwort. Der Antwort-Body enthält die JsonApi-Antwort der erstellten Entität.
POST-Anfrage mit Beziehungen
URL: http://example.com/jsonapi/node/article
Entitätsreferenz-Felder müssen als relationships
und nicht als attributes
gesetzt werden. Andernfalls erscheint die Fehlermeldung „The following relationship fields were provided as attributes“ gefolgt von einer Liste dieser Felder.
Der id
-Schlüssel muss die UUID, nicht die ID der Entität enthalten; Beispiel: faba301b-bdf5-4658-abc1-e173b815984f
.
Request-Body
{
"data": {
"type": "node--article",
"attributes": {
"title": "Artikel von admin",
"body": {
"value": "Eigener Wert",
"format": "plain_text"
}
},
"relationships": {
"uid": {
"data": {
"type": "user--user",
"id": "{{UUID des Benutzers 1}}"
}
},
"field_taxonomy_term_reference": {
"data": {
"type": "taxonomy_term--{{bundle}}",
"id": "{{UUID des Begriffs}}"
}
}
}
}
}
Antwort
HTTP 201 (Created) Antwort. Der Antwort-Body enthält die JsonApi-Antwort der erstellten Entität.
POST-Methode mit der Rest API
Erstelle zunächst ein benutzerdefiniertes Modul mit der REST-Ressource und aktiviere es über /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;
/**
* Stellt eine Ressource bereit, um Nodes zu 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;
/**
* Instanz des aktuellen Benutzers.
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protected $currentUser;
/**
* Konstruktor für das ResourceBase-Objekt.
*
* @param array $configuration
* Konfigurations-Array.
* @param string $plugin_id
* Plugin-ID.
* @param mixed $plugin_definition
* Plugin-Definition.
* @param array $serializer_formats
* Verfügbare Serialisierungsformate.
* @param \Psr\Log\LoggerInterface $logger
* Logger-Instanz.
* @param \Drupal\Core\Session\AccountProxyInterface $current_user
* Instanz des aktuellen Benutzers.
*/
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')
);
}
/**
* Antwortet auf POST-Anfragen.
*
* Erstellt einen neuen Node.
*
* @param mixed $data
* Daten zum Erstellen des Nodes.
*
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
* Erwartete Exception.
*/
public function post($data) {
// Aktuellen Benutzer nach Authentifizierung zur Berechtigungsprüfung verwenden.
if (!$this->currentUser->hasPermission('administer site content')) {
// Standardseite für Zugriff verweigert anzeigen.
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 mit nid @nid gespeichert!\n", ['@nid' => $node->id()]));
$nodes[] = $node->id();
}
$message = $this->t("Neue Nodes erstellt mit nids : @message", ['@message' => implode(",", $nodes)]);
return new ResourceResponse($message, 200);
}
}
Beispielhafte JSON-Daten zum Erstellen von Nodes:
[
{
"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-Befehl zum Ausführen einer POST-Anfrage:
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 von Drupal Documentation.