• урок
  • pantey

Drupal 8 –Использование (REST) RESTfull API

04.07.2017

В 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

rest_api_drupal_8_1.png

PUT – ex-rest/put.json

rest_api_drupal_8_2.png

POST – ex-rest/post.json

rest_api_drupal_8_3.png

DELETE – ex-rest/delete.json

rest_api_drupal_8_4.png

Как вы видите, на все наши HTTP методы приходят соответствующие ответы, описанные в нашем контроллере. Естественно, это не полноценная реализация, данное применение просто бессмысленно, ибо REST используют для интеграций систем, и как минимум не хватает токенов индентификации, в нашем файле маршрутизации и его соответствующая проверка (валидация) в файле контроллера и каких либо параметров, для получения необходимой информации.

Хочу заметить, что особенность REST в том, что сервер не запоминает состояние пользователя между запросами – в каждом запросе передается информация (токен), индентифицирующая пользователя.

Скачать модуль используемый в примере.

Скачать

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (5)

Profile picture for user 1541
Александр
18.08.2017

Это можно в контроллере использовать?

<?php
$request->headers->get( 'Content-Type' );
Profile picture for user pantey
pantey
21.08.2017

да, можно

Profile picture for user 1541
Dirst
17.06.2018

Заголовок про рест апи, а реализовано через систему роутов - читайте документацию

Profile picture for user pantey
pantey
17.06.2018

А что по вашему такое rest api ? Давайте ссылку на документацию - вместе почитаем.

Profile picture for user 1541
Anonymous
09.07.2018

https://www.drupal.org/docs/8/api/restful-web-services-api