Как работать с Entity reference с помощью REST api ?

Аватар пользователя albabosh albabosh 18 февраля 2016 в 12:20

Есть 2 node type: Primary и Secondary. У Primary есть поле entity reference к secondary. Оба типа материала добавляются с помощью rest api. Вопрос: как добавить эту связь ?

0 Thanks

Комментарии

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 19 февраля 2016 в 2:18
  1. послать запрос на создание Secondary
  2. если создалось успешно (код 201), то взять id из заголовка Location
  3. послать запрос на создание Primary. Сам формат связи такой "field_secondary":[{"target_id":id1},{"target_id":id2},...]
Аватар пользователя albabosh albabosh 22 февраля 2016 в 19:39

Вот такой вариант:

$serialized_entity = json_encode([
'title' => [['value' => $title]],
'field_infohash' => [['value' => $infohash]],
'field_size' => [['value' => $size[0]]],
'field_tp' => [['value' => $item]],
// 'field_secondary' => [['target_id' => 3830]],
'type' => [['target_id' => 'primary']],
'_links' => ['type' => [
'href' => 'http://dhtapi-albabosh.c9users.io/drupal/rest/type/node/primary'
]],
]);

- работает, а вот такой:

$serialized_entity = json_encode([
'title' => [['value' => $title]],
'field_infohash' => [['value' => $infohash]],
'field_size' => [['value' => $size[0]]],
'field_tp' => [['value' => $item]],
'field_secondary' => [['target_id' => 3830]],
'type' => [['target_id' => 'primary']],
'_links' => ['type' => [
'href' => 'http://dhtapi-albabosh.c9users.io/drupal/rest/type/node/primary'
]],
]);

- уже нет, при том что nid 3830 реально существует.

"Крайне лаконичные" логи RESTa ничего толкового не содержат, единственная информация:

Warning: file_get_contents(http://dhtapi-albabosh.c9users.io/drupal/entity/node): failed to open stream: HTTP request failed! HTTP/1.1 422 Unprocessable Entity

Аватар пользователя albabosh albabosh 22 февраля 2016 в 20:09

Поменял, но PHP не считает такую запись правильной: Parse error: syntax error, unexpected '{', expecting ']' in /home/ubuntu/workspace/import/importer.php on line 80

Аватар пользователя albabosh albabosh 22 февраля 2016 в 20:10

Квадратные скобки предположительно правильные, т.к. другие поля пишутся верно.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 22 февраля 2016 в 20:15

нужен json синтаксис, т.е. еще : вместо => (а все из-за того, что ты невнимательно посмотрел на мой первый ответ, а я тем более):
на выходе должно получится
'field_secondary':[{'target_id':3830}],

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 22 февраля 2016 в 20:22

нене, меня вообще не слушай, не отошел еще после тяжелого дня)))
так то у тебя нормич запрос, json_encode сам все приведет в нужную форму, так что походу просто rest криво настроен. Как он у тебя вообще устроен, и чем шлешь запрос?

Аватар пользователя albabosh albabosh 22 февраля 2016 в 20:35

Этот вариант 'field_secondary':[{'target_id':3830}], тоже не правильный,
Parse error: syntax error, unexpected '{', expecting ']' in /home/ubuntu/workspace/import/importer.php on line 80. Где именно могут быть ошибки в REST ? Остальные поля пишутся нормально и нода создается (если без reference field). Запрос шлю так:

$result = file_get_contents($url, false, stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => "Content-type: application/hal+json\r\n" .
"Authorization: Basic ".base64_encode("user:pass")."\r\n",
'content' => $serialized_entity
)
)));

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 22 февраля 2016 в 23:53
albabosh wrote:

Этот вариант 'field_secondary':[{'target_id':3830}], тоже не правильный,

Говорю же, я был пьян. Формат у тебя нормальный - пхп-массив, обернутый функцией преобразования в json-формат. Так что в результате получится то, что надо.

Проблема в том, как шлешь, конечно. file_get_contents - где ты откопал этот способ?!) Закопай обратно. Понимаю, пайпы-шмайпы, файлы правят миром, но будь человеком, возьми нормальный инструмент. Зря что ли в 8-ку Guzzle вкручивали?

Вот пример (по необходимости расскоментируй куки и csrf)

<?php

require __DIR__ '/vendor/autoload.php';

$base_url "http://dhtapi-albabosh.c9users.io";

$auth = ['user''pass'];

$serialized_entity json_encode([
  
'title' => [['value' => $title]],
  
'field_infohash' => [['value' => $infohash]],
  
'field_size' => [['value' => $size[0]]],
  
'field_tp' => [['value' => $item]],
  
'field_secondary' => [['target_id' => 3830]],
  
'type' => [['target_id' => 'primary']],
  
'_links' => ['type' => [
    
'href' => 'http://dhtapi-albabosh.c9users.io/drupal/rest/type/node/primary'
  
]],
]);

//$jar = new \GuzzleHttp\Cookie\CookieJar();
$client = new \GuzzleHttp\Client([
  
'base_uri' => $base_url
//  ,'cookies' => $jar
]);

//$response = $client->get('/rest/session/token');
//$csrf = $res->getBody()->getContents();

$response $client
  
->post('/entity/node?_format=hal_json', [
    
'auth' => $auth,
    
'body' => $serialized_entity,
    
'headers' => [
        
'Content-Type' => 'application/hal+json'
//        ,'X-CSRF-Token' => $csrf
    
],
  ]);
?>
Аватар пользователя albabosh albabosh 23 февраля 2016 в 10:27

file_get_contents я тупо списал, т.к. в рнр не особо шарю. Но оно работает, и все поля пишутся, и нода создается. Проблема только с entity reference, без нее все класс. Я подозревая что target_id - это неправильно, но как правильно нигде не нашел.

Аватар пользователя albabosh albabosh 2 марта 2016 в 13:18

Все получилось, все правильно, просто у меня secondary был не опубликован, поэтому связь не создавалась