Création de nouvelles ressources (POST)
Cette page montre des exemples de différentes requêtes POST pour le module JSON:API.
Les requêtes POST sont utilisées pour créer de nouvelles ressources. Si vous souhaitez modifier des ressources, vous devez utiliser PATCH.
La spécification JSON:API (et donc le module JSON:API) supporte uniquement la création d’une ressource par requête POST. Pour Drupal, cela signifie qu’il n’est pas possible (avec ce seul module) de créer plusieurs entités en une seule requête. Vous pourriez vouloir faire cela si vous souhaitez créer des entités référencées en même temps qu’une entité parente. Bien que JSON:API ne supporte pas ce comportement, des modules comme Subrequests peuvent répondre à ces besoins.
Activation de l’opération de création
Rendez-vous à /admin/config/services/jsonapi
et cochez l’option « Accepter toutes les opérations JSON:API de création, lecture, mise à jour et suppression. »

Authentification
Typiquement, une forme d’authentification est utilisée pour les requêtes POST. Les exemples ci-dessous utilisent tous l’authentification Basic avec le nom d’utilisateur et le mot de passe d’un utilisateur existant du site qui a la permission de créer le contenu donné.
Activez le module d’authentification HTTP Basic (basic_auth
), attribuez la permission à l’utilisateur API (et son rôle) et définissez le nom d’utilisateur et mot de passe encodés dans l’en-tête de requête 'Authorization'.
L’exemple d’en-tête sur cette page nécessite un utilisateur Drupal avec le nom d’utilisateur « api » et le mot de passe « api ».
En-têtes
Les en-têtes suivants sont obligatoires pour toute requête POST afin d’obtenir une requête et réponse JSON:API correcte :
Accept: application/vnd.api+json
Content-Type: application/vnd.api+json
L’en-tête suivant est nécessaire pour que les exemples fonctionnent :
Authorization: Basic YXBpOmFwaQ==
Curl
Supposons que vos données sont dans le fichier 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
Requête POST basique
URL : http://example.com/jsonapi/node/article
Corps de la requête
{
"data": {
"type": "node--article",
"attributes": {
"title": "Mon titre personnalisé",
"body": {
"value": "Valeur personnalisée",
"format": "plain_text"
}
}
}
}
Réponse
Réponse HTTP 201 (Créé). Le corps de la réponse contient la réponse JsonApi de l’entité créée.
Requête POST avec relations
URL : http://example.com/jsonapi/node/article
Les champs de référence d’entité doivent être définis comme relationships
et non comme attributes
. Si ce n’est pas le cas, vous verrez le message d’erreur « The following relationship fields were provided as attributes » suivi d’une liste des champs posant problème.
La clé id
doit contenir le UUID, pas l’ID, de l’entité ; exemple : faba301b-bdf5-4658-abc1-e173b815984f
.
Corps de la requête
{
"data": {
"type": "node--article",
"attributes": {
"title": "Article par admin",
"body": {
"value": "Valeur personnalisée",
"format": "plain_text"
}
},
"relationships": {
"uid": {
"data": {
"type": "user--user",
"id": "{{UUID de l’utilisateur 1}}"
}
},
"field_taxonomy_term_reference": {
"data": {
"type": "taxonomy_term--{{bundle}}",
"id": "{{UUID du terme}}"
}
}
}
}
}
Réponse
Réponse HTTP 201 (Créé). Le corps de la réponse contient la réponse JsonApi de l’entité créée.
Méthode POST utilisant l’API Rest
Commencez par créer un module personnalisé avec la ressource REST et activez-le en naviguant vers /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;
/**
* Fournit une ressource pour poster des nodes.
*
* @RestResource(
* id = "rest_resource_post_example",
* label = @Translation("Exemple de ressource REST POST"),
* uri_paths = {
* "create" = "/rest/api/post/node-create"
* }
* )
*/
class RestResourcePostExample extends ResourceBase {
use StringTranslationTrait;
/**
* Instance de l’utilisateur courant.
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protected $currentUser;
/**
* Constructeur.
*
* @param array $configuration
* Tableau de configuration du plugin.
* @param string $plugin_id
* ID du plugin.
* @param mixed $plugin_definition
* Définition du plugin.
* @param array $serializer_formats
* Formats de sérialisation disponibles.
* @param \Psr\Log\LoggerInterface $logger
* Instance de logger.
* @param \Drupal\Core\Session\AccountProxyInterface $current_user
* Instance de l’utilisateur courant.
*/
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')
);
}
/**
* Répond aux requêtes POST.
*
* Crée un nouveau node.
*
* @param mixed $data
* Données pour créer le node.
*
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
* Exception levée en cas d’erreur.
*/
public function post($data) {
// Utiliser l’utilisateur courant après authentification pour valider l’accès.
if (!$this->currentUser->hasPermission('administer site content')) {
// Affiche la page par défaut d’accès refusé.
throw new AccessDeniedHttpException('Accès refusé.');
}
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 avec nid @nid enregistré !\n", ['@nid' => $node->id()]));
$nodes[] = $node->id();
}
$message = $this->t("Nouveaux Nodes créés avec nids : @message", ['@message' => implode(",", $nodes)]);
return new ResourceResponse($message, 200);
}
}
Données JSON exemple pour créer des nodes :
[
{
"nodetype": "article",
"title": "Formation",
"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": "Gestion de produit",
"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": "Développement commercial",
"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."
}
]
Commande Curl pour faire une requête 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
Article tiré de la documentation Drupal.