Правильное rest api в d8 - Евгений Юдкин, drupaljedi
TRANSCRIPT
![Page 1: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/1.jpg)
PDFer: создаем PDF документы легко.
Троеглазов Андрей
Правильное REST API.В D8.
Evgeny Yudkin
![Page 2: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/2.jpg)
Evgeny Yudkin
Drupal developerTechnical leader
● 3 years in development;● Drupal contributor;● Drupal audit;● Working under API using D8.
![Page 3: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/3.jpg)
● API;● Инструменты;● Подходы;● REST;● Реализация в D8.
О чём эта презентация?
![Page 4: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/4.jpg)
● Мобильные приложения;● Фронтенд;● Другие сервисы нашего приложения (микросервисная
архитектура);● Сторонние приложения (публичное API).
API
![Page 5: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/5.jpg)
Архитектура:API-first
![Page 6: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/6.jpg)
Пользователи
Фронтенд
Представление
Бизнес-логика
База данных
API HTMLВсе этапы на каждый запрос(“толстый сервер”)
Classic
![Page 7: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/7.jpg)
API-firstПользователи
Фронтенд
Представление
База данных
HTML
Бизнес-логика
“Мобильные”пользователи
API API“тонкий сервер”
![Page 8: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/8.jpg)
API-first
![Page 9: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/9.jpg)
REST
![Page 10: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/10.jpg)
● RESTful - это дизайн API;● Про понятность;● Некий стандарт;● Полностью 100%-но никто не поддерживает;● Но существуют BEST Practices и паттерны;
REST? RESTful?
![Page 11: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/11.jpg)
● В основе REST лежит концепция разделения структуры API на логические ресурсы, не связанные с представлением данных внутри приложения;
● Основывается на HTTP;● Переиспользует существующие стандарты и
фишечки.
REST? RESTful?
![Page 12: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/12.jpg)
● /cars - список машин;● /cars/1 - конкретная машина;● /cars/1/drivers - список водителей;● /cars?color=red - поиск машины по цвету.
Пример
![Page 13: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/13.jpg)
● Клиент-серверная архитектура;● Cервер не хранит состояние (Stateless);● Кэшируемость;● Многослойная структура;● Единый интерфейс;● Код по требованию (опционально).
REST? RESTful?
![Page 14: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/14.jpg)
● Рест оперирует ресурсами;● Ресурсы могут быть связаны между собой;
Ресурсы
![Page 15: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/15.jpg)
Готовим REST правильно
![Page 16: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/16.jpg)
● Не привязываемся к структуре сущностей в приложении/cars вместо /node;
● Используем http-методы○ GET - для получения;○ POST или PUT - для создания;○ PATCH - для модификации;○ DELETE - для удаления;
Делаем правильно
![Page 17: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/17.jpg)
● Используем конкретные имена вместо абстрактных○ /items - зло;
● Для сущностей, а не действий - используем существительные○ /getAllCars - плохо;
● GET’ы - “безопасны” и ничего не меняют;● Для связей используем под-ресурсы:
○ /cars/1/drivers● Для определения формата используем заголовки:
○ Content-Type○ Accept
Делаем правильно
![Page 18: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/18.jpg)
● Фильтрация;● Сортировка;● Пагинация;● Частичные ответы;
Делаем правильно
![Page 19: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/19.jpg)
● Используем http-статусы;● Для ошибок возвращаем полезную нагрузку;● Идемпотентность всего, кроме POST;
Делаем правильно
![Page 20: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/20.jpg)
Инструменты
![Page 21: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/21.jpg)
● POST
○ Если API само должно вернуть идентификатор объекта;○ Дубликаты.
● PUT
○ Если мы знаем урл (идентификатор) создаваемого объекта;○ Идемпотентность.
REST: POST vs PUT
![Page 22: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/22.jpg)
● Определение
○ Через URL: /api/v1/something;○ Через User Agent или другие
заголовки/параметры запроса;
● Изменения○ Глобальные изменения (бизнес-логика)
■ Новый код;
○ Изменения формата■ Изменения в выводе;
Версионирование
Бизнес-логика
Определение версии API
Запрос
Формат 1 Формат 2
Ответ
![Page 23: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/23.jpg)
● Hypermedia as the Engine of Application State;
О чём это?
● В каждом полученном ответе содержится ссылка на следующий запрос.
Гипертекст и HATEOAS
![Page 24: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/24.jpg)
HAL
● Hypertext Application Language
{ "_links": { "self": { "href": "http://example.org/api/user/matthew" } }, "id": "matthew", "name": "Matthew Weier O'Phinney"}
![Page 25: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/25.jpg)
{ "_links":{ "self":{ "href":"http:\/\/dev.ru\/node\/4?_format=hal_json" }, "type":{ "href":"http:\/\/dev.ru\/rest\/type\/node\/page" }, "http:\/\/dev.ru\/rest\/relation\/node\/page\/field_article":[ { "href":"http:\/\/dev.ru\/node\/3?_format=hal_json" } ] }, ….}
![Page 26: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/26.jpg)
● Модель срока действия;● Модель валидности;
○ ETag;○ Last-Modified;
Кэширование
![Page 27: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/27.jpg)
Drupal 8
![Page 28: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/28.jpg)
● REST-плагины;● RestResponce;● Нет обработки ошибок;● Настройка “по ресурсу” и “по verb’u”:
○ Аутентификация;○ Пермишены;○ Формат;
● Множество ресурсов “по умолчанию”:○ Универсальный для любой content entity;
REST module
![Page 29: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/29.jpg)
● Предоставляет возможность создавать endpoint’ы;● Можно прикреплять к endpoint’ам ресурсы и настраивать их;
● Например: /v1/node/{node}
Services module
![Page 30: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/30.jpg)
● JSON API○ Стандарт;○ Формат - JSON;○ Не hal_json, но при этом поддерживает hal;
JSONAPI
![Page 31: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/31.jpg)
● Модуль○ Предоставляет набор ресурсов “по умолчанию”, включая
универсальный;○ Предоставляет коллекции;○ Нет UI;○ Не связан с модулем REST;○ Нет настройки “по ресурсу”;○ Сложности с кастомными ресурсами;○ Нестабилен при работе с file_entity и другими кастомными
нормализаторами;
JSONAPI module
![Page 32: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/32.jpg)
● Связан с REST;● Предоставляет несколько REST-ресурсов для получения данных о
структуре сущностей;● Нужен для работы одноименных фронтенд-библиотек.
WATERWHEEL module
![Page 33: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/33.jpg)
● Является частью DrupalDeploy;● Зависим от REST;● Предоставляет улучшенную поддержку:
○ Ревизионности;○ Мультиязычности;○ Связями через uuid;○ Работы с файлами;
■ Multipart;
RELAXED module
![Page 34: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi](https://reader033.vdocuments.site/reader033/viewer/2022052318/5882e4821a28ab33258b6c29/html5/thumbnails/34.jpg)
● Формально с REST не связан;● Превращает файлы в сущности с возможностью добавлять поля;● Эти сущности можно создавать через REST;● Предоставляет нормалайзеры для работы с контентом файлов в
base64;● Нормалайзеры работают только с hal_json.
FILE_ENTITY module