При разработке API всегда необходимо указать, какой метод HTTP будет использоваться для выполнения операций CRUD с данными. Здесь это можно сделать возможным с помощью нескольких HTTP-запросов, таких как POST (создание данных), GET (получение / чтение данных), DELETE (удаление данных) или PATCH / PUT (обновление данных). Чтобы узнать, как создавать собственные веб-службы, мы создадим настраиваемый модуль, представляющий RESTful API, который может отображать список терминов таксономии с нашего сайта Drupal 9.
Шаг 1. Создаем свой модуль sample_rest_resource в директории modules/custom.
Шаг 2. Создаем файл с расширением info.yml для описания модуля sample_rest_resource.
В файле будет следующее описание:
name: Sample Rest Resource
type: module
description: Module for implementing Custom Rest Service.
core_version_requirement: ^8.8 || ^9
package: Example
И создаем пустой файл sample_rest_resource.module. Получится такая структура:
Шаг 3. Создаем структуру в создаваемом модуле src \Plugin\rest\resource:
Шаг 4. Создаем файл ресурсов SampleGetRestResource.php в директории resource, добавляем следующий код:
<?
namespace Drupal\sample_rest_resource\Plugin\rest\resource;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
use Psr\Log\LoggerInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
/**
* Provides a resource to get view modes by entity and bundle.
* @RestResource(
* id = "custom_get_rest_resource",
* label = @Translation("Custom Get Rest Resource"),
* uri_paths = {
* "canonical" = "/vb-rest"
* }
* )
*/
class SampleGetRestResource extends ResourceBase {
/**
* A current user instance which is logged in the session.
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protected $loggedUser;
/**
* Constructs a Drupal\rest\Plugin\ResourceBase object.
*
* @param array $config
* A configuration array which contains the information about the plugin instance.
* @param string $module_id
* The module_id for the plugin instance.
* @param mixed $module_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 currently logged user instance.
*/
public function __construct(
array $config,
$module_id,
$module_definition,
array $serializer_formats,
LoggerInterface $logger,
AccountProxyInterface $current_user) {
parent::__construct($config, $module_id, $module_definition, $serializer_formats, $logger);
$this->loggedUser = $current_user;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $config, $module_id, $module_definition) {
return new static(
$config,
$module_id,
$module_definition,
$container->getParameter('serializer.formats'),
$container->get('logger.factory')->get('sample_rest_resource'),
$container->get('current_user')
);
}
/**
* Responds to GET request.
* Returns a list of taxonomy terms.
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
* Throws exception expected.
*/
public function get() {
// Implementing our custom REST Resource here.
// Use currently logged user after passing authentication and validating the access of term list.
if (!$this->loggedUser->hasPermission('access content')) {
throw new AccessDeniedHttpException();
}
$vid = 'vb';
$terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid);
foreach ($terms as $term) {
$term_result[] = array(
'id' => $term->tid,
'name' => $term->name
);
}
$response = new ResourceResponse($term_result);
$response->addCacheableDependency($term_result);
return $response;
}
}
Используем метод GET в шаблоне, в котором мы определяем нашу логику в форме кода, чтобы определить, какой вывод требуется. В качестве примера — нам требуется название всех существующих терминов с соответствующими идентификаторами для таксономии vb (машинное имя Vb Test) для текущего пользователя, вошедшего в систему.
Шаг 5. Создаем словарь таксономии Vb Test и несколько терминов.
Добавляем, например, 2 термина:
Шаг 6. Подключаем Drupal REST API из ядра системы.
Созданный модуль зависит от модуля пользовательского интерфейса Rest и Rest. Модуль Rest UI можно установить с помощью этой команды:
composer require 'drupal/restui:^1.20'
После установки модуля RestUI, необходимо включить оба модуля как на скриншотах:
Шаг 7. Включаем созданный модуль:
Шаг 8. После включения модуля, включаем ресурс. Действия по пунктам:
- Переходим по адресу /admin/config/services/rest
- Находим созданный ресурс. Он будет называться также как его назвали: Custom Get Rest Resource.
- Включаем и нажимаем Сохранить конфигурацию:
4. Переходим по адресу /vb-rest?_format=json и увидим, что данный url вернул запрошенные данные из словаря и параметры терминов.
REST можно использовать как тип передачи данных, построенный на основе архитектуры протоколов HTTP. Это помогает легко отправлять и извлекать данные между двумя или более разными службами с помощью XML или JSON.
Количество просмотров: 244