Рейтинг:0

Миграция пользовательского Rest API с использованием PATCH/POST

флаг lb

У меня был собственный REST API, отлично работающий с Drupal 8. После обновления до Drupal 9.2.X Пластырь и Публиковать методы этого пользовательского REST API перестали работать. Теперь они выдают следующее исключение.

RuntimeException: вызываемый "Drupal\my_module\Plugin\rest\resource\UpdateBoxes::patch" требует значения для аргумента "$payload". в Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (строка 143 файла /var/www/docroot/core/lib/Drupal/Component/Utility/ArgumentsResolver.php).

Код, который я использую, следующий.

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

используйте Drupal\rest\ModifiedResourceResponse;

/**
 * Предоставляет ресурс для получения режимов просмотра по объектам и пакетам.
 *
 * @RestResource(
 * id = "update_boxes",
 * label = @Translation("Обновить поля"),
 * uri_paths = {
 * "canonical" = "/api/container/{container_id}/{type}/{product_id}/boxes"
 * }
 * )
 */
класс UpdateBoxes расширяет ResourceBase {

  /**
   * Текущий экземпляр пользователя.
   *
   * @var\Drupal\Core\Session\AccountProxyInterface
   */
  защищенный $currentUser;

  защищенный $boxesHandler;

  защищенный $event_dispacher;

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция create(ContainerInterface $container, массив $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->currentUser = $container->get('current_user');
    $instance->boxesHandler = $container->get('boxes.handler');
    $instance->event_dispacher = $container->get('event_dispatcher');

    вернуть $экземпляр;
  }

  /**
   * Отвечает на запросы PATCH.
   *
   * @параметр $container_id
   * @параметр $тип
   * @параметр $product_id
   * @param $полезная нагрузка
   * @return \Drupal\rest\ModifiedResourceResponse
   * Объект ответа HTTP.
   */
    патч общедоступной функции ($container_id = null, $type = null, $product_id = null, $payload) {
      //Мой код здесь.
     
    }

}

В пластырь() я мог читать $ полезная нагрузка и видим массив отправленный в запросе, но после обновления сайта, $ полезная нагрузка является НОЛЬ.

Решение, которое я нашел, заключалось в изменении последнего аргумента пластырь() и извлечь полезную нагрузку из $запрос объект.

Патч публичной функции ($container_id = null, $type = null, $product_id = null, Request $request) {
  // ¦
  $payload = json_decode($request->getContent(), TRUE);
}

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

Рейтинг:1
флаг cn

У меня такая же проблема с получать метод. Кажется, это связано с преобразованием параметров (см. сообщение о проблеме). Мне удалось обойти проблему, используя простые имена параметров, например, удалить все символы подчеркивания в комментариях и именах параметров метода:

"canonical" = "/api/container/{containerid}/{type}/{productid}/boxes"

И в методе:

Патч публичной функции ($containerid = null, $type = null, $productid = null, Request $request) {
mogio avatar
флаг cn
Спасибо. Это сработало. Этот должен быть помечен как «ответ». Я удалил символы подчеркивания из параметра и переименовал каноническое имя параметра в точное имя $var функции get. :) Более интересно то, что это работало в Drupal 8 :)

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

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