Рейтинг:1

Пользовательский ресурс REST выдает ошибку 404.

флаг np

Я создал пользовательский ресурс REST для создания конкретной записи узла. (Мне нужны дополнительные проверки, поэтому я не могу использовать доступный ресурс узла.) Конечная точка включена в пользовательском интерфейсе. Однако, когда я делаю POST-вызов конечной точке в /rest/ticketmatic, он возвращает 404. Ниже приведен код в файле modules/custom/ticketmatic/src/Plugin/rest/resource/Ticketmatic.php.

пространство имен Drupal\ticketmatic\Plugin\rest\resource;

используйте Drupal\Component\Serialization\Json;
используйте Drupal\Core\Datetime\DrupalDateTime;
используйте Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
используйте Drupal\node\Entity\Node;
используйте Drupal\rest\Plugin\ResourceBase;
используйте Drupal\rest\ResourceResponse;
используйте Symfony\Component\HttpFoundation\Request;

/**
 * Аннотация для почтового метода
 *
 * @RestResource(
 * id = "тикетматик",
 * label = @Translation("Ticketmatic"),
 * сериализация_класс = "",
 * uri_paths = {
 * "canonical" = "/rest/ticketmatic",
 * "https://www.drupal.org/link-relations/create" = "/rest/ticketmatic"
 * }
 * )
 */
класс Ticketmatic расширяет ResourceBase {

  /**
   * @param Запрос $запрос
   *
   * @return ResourceResponse
   * @throws\Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws\Drupal\Component\Plugin\Exception\PluginNotFoundException
   * @throws\Drupal\Core\Entity\EntityStorageException
   */
  сообщение публичной функции (запрос $ request) {
    $response_status['статус'] = ложь;
    $params = Json::decode($request->getContent());
    $timezone = новый \DateTimeZone('UTC');
    $ данные = [
      'ид' => 2,
      'тип' => 'концерт',
      'название' => $params['название'],
      'field_concert_tm_id' => $params['ID'],
      'field_concert_location' => $params['location'],
      'field_concert_ticket_status' => $params['ticket_status'],
      'field_concert_datetime' => DrupalDateTime::createFromTimestamp($params->datetime, $timezone)
        -> формат (DateTimeItemInterface:: DATETIME_STORAGE_FORMAT),
    ];

    $existingNodes = \Drupal::entityTypeManager()->getStorage('узел')
      ->loadByProperties(['field_concert_tm_id' => $params->ID]);

    если ($ узел = сброс ($ существующие узлы)) {
      $node->set('заголовок', $params->заголовок);
      $node->set('field_concert_location', $params->location);
      $node->set('field_concert_ticket_status', $params->ticket_status);
      $node->set('field_concert_datetime', DrupalDateTime::createFromTimestamp($params->datetime, $timezone)
        ->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT));
    }
    еще {
      $node = Node::create($data);
    }

    если ($ узел-> сохранить ()) {
      $response_status['статус'] = истина;
    }

    $response = новый ResourceResponse($response_status);

    вернуть $ответ;
  }

}

Я в недоумении, потому что аналогичный код работает в другом проекте; единственное отличие заключается в версии Drupal, используемой в этом проекте.

Любая помощь, совет или указатель приветствуются.

Это конфигурация конечной точки.

UUID: 8551c284-e6e5-4e28-9c39-6b4b4bc8a6d7
код языка: nl
статус: правда
зависимости:
  модуль:
    - базовая_аутентификация
    - сериализация
    - тикетматик
идентификатор: билетматик
plugin_id: билетматик
гранулярность: ресурс
конфигурация:
  методы:
    - ПУБЛИКОВАТЬ
  форматы:
    - json
  аутентификация:
    - базовая_аутентификация
Lambic avatar
флаг ph
На первый взгляд вроде должно работать. Несколько очевидных вопросов: модуль включен? Вы очистили кеш? В логах есть что-нибудь актуальное? Как выглядит включенная конфигурация конечной точки?
Stephan de Bruin avatar
флаг np
Модуль включен, кэш очищен, логи очищены (несколько раз). Я добавил конфигурацию конечной точки в исходный пост.
Lambic avatar
флаг ph
Попробуйте изменить «https://www.drupal.org/link-relations/create» на «создать». Попробуйте использовать сервис request_stack, чтобы получить запрос, вместо того, чтобы передавать его в качестве параметра post().
Stephan de Bruin avatar
флаг np
Спасибо @Lambic, изменение «создать» было тем, что исправило это.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.