В Drupal 8, как мы уже знаем, очень много изменений – они коснулись не только подходом к разработке, путем перехода на ООП, сменой системы темизации и т.д., но и внедрением новых API. Сегодня о таком новом API мы и поговорим – RESTfull API.
Итак, что же такое REST вкратце - это стиль архитектуры программного обеспечения для распределенных систем, таких как World Wide Web, который, как правило, используется для построения веб-служб, - именно такое описание дает Хабрахабр. А если простым языком – это система взаимодействия клиент / сервер путем HTTP запросов.
REST, в нашей жизни, встречается очень часто, как правило, на REST построены все API, каких либо сервисов, для интеграции с вашим ресурсом (сайтом, приложением).
Все взаимодействие сводится к минимум 4м операциям, где для каждой операции используется свой HTTP – метод:
- Получение данных - GET
- Добавление данных - POST
- Редактирование данных - PUT
- Удаление данных - DELETE
Хочу заметить, что это список минимум, который реализуется в системах REST.
Итак, далее я продемонстрирую простую реализацию RESTfull в Drupal 8, и как всегда реализация будет в отдельном модуле, в моем случае будет называться – ex_rest.
Файл ex_rest.info.yml
name: Example Rest API
type: module
description: Простой пример использования RESTfull API в Drupal 8
core: 8.x
Файл маршрутизации – ex_routing.yml
ex_rest.get:
path: 'ex-rest/get.json'
defaults: { _controller: '\Drupal\ex_rest\Controller\ExRestController::get_example' }
methods: [GET]
requirements:
_access: 'TRUE'
ex_rest.put:
path: 'ex-rest/put.json'
defaults: { _controller: '\Drupal\ex_rest\Controller\ExRestController::put_example' }
methods: [PUT]
requirements:
_access: 'TRUE'
ex_rest.post:
path: 'ex-rest/post.json'
defaults: { _controller: '\Drupal\ex_rest\Controller\ExRestController::post_example' }
methods: [POST]
requirements:
_access: 'TRUE'
ex_rest.delete:
path: 'ex-rest/delete.json'
defaults: { _controller: '\Drupal\ex_rest\Controller\ExRestController::delete_example' }
methods: [DELETE]
requirements:
_access: 'TRUE'
Контроллер – файл ExRestController.php
<?php
/**
* @file
* Contains \Drupal\ex_rest\Controller\ExRestController.
*/
namespace Drupal\ex_rest\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* Controller routines for ex_rest routes.
*/
class ExRestController extends ControllerBase {
/**
* Callback for `ex-rest/get.json` API method.
*/
public function get_example( Request $request ) {
$response['data'] = 'Return JSON data';
$response['method'] = 'GET';
return new JsonResponse( $response );
}
/**
* Callback for `ex-rest/put.json` API method.
*/
public function put_example( Request $request ) {
$response['data'] = 'Return PUT data';
$response['method'] = 'PUT';
return new JsonResponse( $response );
}
/**
* Callback for `ex-rest/post.json` API method.
*/
public function post_example( Request $request ) {
// This condition checks the `Content-type` and makes sure to
// decode JSON string from the request body into array.
if ( 0 === strpos( $request->headers->get( 'Content-Type' ), 'application/json' ) ) {
$data = json_decode( $request->getContent(), TRUE );
$request->request->replace( is_array( $data ) ? $data : [] );
}
$response['data'] = 'Return POST data';
$response['method'] = 'POST';
return new JsonResponse( $response );
}
/**
* Callback for `ex-rest/delete.json` API method.
*/
public function delete_example( Request $request ) {
$response['data'] = 'Return Delete method';
$response['method'] = 'DELETE';
return new JsonResponse( $response );
}
}
Для получения заголовков используйте:
<?php
$request->headers->get( 'Content-Type' );
Для получения содержимого ответа используйте:
<?php
$request->getContent();
Хочу заметить, что в большинстве случаев, API реализованное на REST, всегда возвращает данные в JSON формате, в продвинутых системах еще и в XML, но никто не запрещает использовать hal+json или siren.
Теперь, давайте проверим наши HTTP ответы.
GET – ex-rest/get.json
PUT – ex-rest/put.json
POST – ex-rest/post.json
DELETE – ex-rest/delete.json
Как вы видите, на все наши HTTP методы приходят соответствующие ответы, описанные в нашем контроллере. Естественно, это не полноценная реализация, данное применение просто бессмысленно, ибо REST используют для интеграций систем, и как минимум не хватает токенов индентификации, в нашем файле маршрутизации и его соответствующая проверка (валидация) в файле контроллера и каких либо параметров, для получения необходимой информации.
Хочу заметить, что особенность REST в том, что сервер не запоминает состояние пользователя между запросами – в каждом запросе передается информация (токен), индентифицирующая пользователя.
Скачать модуль используемый в примере.
Комментарии (5)
Это можно в контроллере использовать?
<?php $request->headers->get( 'Content-Type' );
да, можно
Заголовок про рест апи, а реализовано через систему роутов - читайте документацию
А что по вашему такое rest api ? Давайте ссылку на документацию - вместе почитаем.
https://www.drupal.org/docs/8/api/restful-web-services-api