Kreiranje novih resursa (POST)
Ova stranica prikazuje primere raznih POST zahteva za JSON:API modul.
POST zahtevi se koriste za kreiranje novih resursa. Ako želite da izmenite resurse, treba da koristite PATCH zahteve.
JSON:API specifikacija (a samim tim i JSON:API modul) podržava kreiranje samo jednog resursa po POST zahtevu. Za Drupal, to znači da nije moguće (samo ovim modulom) kreirati više entiteta u jednom zahtevu. Ovo može biti potrebno ako želite da kreirate referencirane entitete istovremeno sa roditeljskim entitetom. Dok JSON:API ne podržava takvo ponašanje, moduli kao što je Subrequests mogu pomoći u tim zahtevima.
Omogućavanje kreiranja resursa
Posetite /admin/config/services/jsonapi
i čekirajte opciju "Accept all JSON:API create, read, update, and delete operations." (Prihvati sve JSON:API operacije: kreiranje, čitanje, izmenu i brisanje).

Autentifikacija
Obično se za POST zahteve koristi neka vrsta autentifikacije. Svi primeri ispod koriste Basic Authentication sa korisničkim imenom i lozinkom postojećeg korisnika na sajtu koji ima dozvolu da kreira zadati sadržaj.
Omogućite HTTP Basic Authentication (basic_auth
) modul, podesite dozvole za API korisnika (i ulogu) i podesite kodirano korisničko ime i lozinku u 'Authorization' zaglavlje zahteva.
Zaglavlje iz primera na ovoj stranici zahteva Drupal korisnika sa korisničkim imenom 'api' i lozinkom 'api'.
Zaglavlja
Sledeća zaglavlja su obavezna za sve POST zahteve kako bi JSON:API pravilno obradio zahtev i dao odgovor.
Accept: application/vnd.api+json
Content-Type: application/vnd.api+json
Sledeće zaglavlje je potrebno za funkcionisanje primera:
Authorization: Basic YXBpOmFwaQ==
Curl
Pretpostavimo da su vaši podaci u fajlu 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
Osnovni POST zahtev
URL: http://example.com/jsonapi/node/article
Telo zahteva
{
"data": {
"type": "node--article",
"attributes": {
"title": "My custom title",
"body": {
"value": "Custom value",
"format": "plain_text"
}
}
}
}
Odgovor
HTTP 201 (Created) odgovor. Telo odgovora sadrži JsonApi odgovor kreiranog entiteta.
POST zahtev sa relacijama
URL: http://example.com/jsonapi/node/article
Polja sa referencama na entitete moraju biti postavljena kao relationships
, ne kao attributes
. Ako to ne uradite, dobićete poruku o grešci "The following relationship fields were provided as attributes" sa spiskom problematičnih polja.
Ključ id
mora sadržati UUID, a ne ID entiteta, na primer: faba301b-bdf5-4658-abc1-e173b815984f
.
Telo zahteva
{
"data": {
"type": "node--article",
"attributes": {
"title": "Article by admin",
"body": {
"value": "Custom value",
"format": "plain_text"
}
},
"relationships": {
"uid": {
"data": {
"type": "user--user",
"id": "{{UUID of user 1}}"
}
},
"field_taxonomy_term_reference": {
"data": {
"type": "taxonomy_term--{{bundle}}",
"id": "{{UUID of the term}}"
}
}
}
}
}
Odgovor
HTTP 201 (Created) odgovor. Telo odgovora sadrži JsonApi odgovor kreiranog entiteta.
POST metoda korišćenjem REST API-ja
Prvo napravite custom modul sa REST resursom i omogućite ga tako što ćete otići na /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;
/**
* Provides a resource to post nodes.
*
* @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;
/**
* A current user instance.
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protected $currentUser;
/**
* Constructs a Drupal\rest\Plugin\ResourceBase object.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param array $serializer_formats
* The available serialization formats.
* @param \Psr\Log\LoggerInterface $logger
* A logger instance.
* @param \Drupal\Core\Session\AccountProxyInterface $current_user
* A current user instance.
*/
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')
);
}
/**
* Responds to POST requests.
*
* Creates a new node.
*
* @param mixed $data
* Data to create the node.
*
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
* Throws exception expected.
*/
public function post($data) {
// Use current user after pass authentication to validate access.
if (!$this->currentUser->hasPermission('administer site content')) {
// Display the default access denied page.
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 with nid @nid saved!\n", ['@nid' => $node->id()]));
$nodes[] = $node->id();
}
$message = $this->t("New Nodes Created with nids : @message", ['@message' => implode(",", $nodes)]);
return new ResourceResponse($message, 200);
}
}
Primer JSON podataka za kreiranje čvorova:
[
{
"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 komanda za POST zahtev :
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
Članak sa Drupal dokumentacije.