Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

35
PDFer: создаем PDF документы легко. Троеглазов Андрей Правильное REST API. В D8. Evgeny Yudkin

Transcript of Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

Page 1: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

PDFer: создаем PDF документы легко.

Троеглазов Андрей

Правильное REST API.В D8.

Evgeny Yudkin

Page 2: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

Evgeny Yudkin

Drupal developerTechnical leader

● 3 years in development;● Drupal contributor;● Drupal audit;● Working under API using D8.

Page 3: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● API;● Инструменты;● Подходы;● REST;● Реализация в D8.

О чём эта презентация?

Page 4: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Мобильные приложения;● Фронтенд;● Другие сервисы нашего приложения (микросервисная

архитектура);● Сторонние приложения (публичное API).

API

Page 5: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

Архитектура:API-first

Page 6: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

Пользователи

Фронтенд

Представление

Бизнес-логика

База данных

API HTMLВсе этапы на каждый запрос(“толстый сервер”)

Classic

Page 7: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

API-firstПользователи

Фронтенд

Представление

База данных

HTML

Бизнес-логика

“Мобильные”пользователи

API API“тонкий сервер”

Page 8: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

API-first

Page 9: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

REST

Page 10: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● RESTful - это дизайн API;● Про понятность;● Некий стандарт;● Полностью 100%-но никто не поддерживает;● Но существуют BEST Practices и паттерны;

REST? RESTful?

Page 11: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● В основе REST лежит концепция разделения структуры API на логические ресурсы, не связанные с представлением данных внутри приложения;

● Основывается на HTTP;● Переиспользует существующие стандарты и

фишечки.

REST? RESTful?

Page 12: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● /cars - список машин;● /cars/1 - конкретная машина;● /cars/1/drivers - список водителей;● /cars?color=red - поиск машины по цвету.

Пример

Page 13: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Клиент-серверная архитектура;● Cервер не хранит состояние (Stateless);● Кэшируемость;● Многослойная структура;● Единый интерфейс;● Код по требованию (опционально).

REST? RESTful?

Page 14: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Рест оперирует ресурсами;● Ресурсы могут быть связаны между собой;

Ресурсы

Page 15: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

Готовим REST правильно

Page 16: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Не привязываемся к структуре сущностей в приложении/cars вместо /node;

● Используем http-методы○ GET - для получения;○ POST или PUT - для создания;○ PATCH - для модификации;○ DELETE - для удаления;

Делаем правильно

Page 17: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Используем конкретные имена вместо абстрактных○ /items - зло;

● Для сущностей, а не действий - используем существительные○ /getAllCars - плохо;

● GET’ы - “безопасны” и ничего не меняют;● Для связей используем под-ресурсы:

○ /cars/1/drivers● Для определения формата используем заголовки:

○ Content-Type○ Accept

Делаем правильно

Page 18: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Фильтрация;● Сортировка;● Пагинация;● Частичные ответы;

Делаем правильно

Page 19: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Используем http-статусы;● Для ошибок возвращаем полезную нагрузку;● Идемпотентность всего, кроме POST;

Делаем правильно

Page 20: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

Инструменты

Page 21: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● POST

○ Если API само должно вернуть идентификатор объекта;○ Дубликаты.

● PUT

○ Если мы знаем урл (идентификатор) создаваемого объекта;○ Идемпотентность.

REST: POST vs PUT

Page 22: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Определение

○ Через URL: /api/v1/something;○ Через User Agent или другие

заголовки/параметры запроса;

● Изменения○ Глобальные изменения (бизнес-логика)

■ Новый код;

○ Изменения формата■ Изменения в выводе;

Версионирование

Бизнес-логика

Определение версии API

Запрос

Формат 1 Формат 2

Ответ

Page 23: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Hypermedia as the Engine of Application State;

О чём это?

● В каждом полученном ответе содержится ссылка на следующий запрос.

Гипертекст и HATEOAS

Page 24: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

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

{ "_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

● Модель срока действия;● Модель валидности;

○ ETag;○ Last-Modified;

Кэширование

Page 27: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

Drupal 8

Page 28: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● REST-плагины;● RestResponce;● Нет обработки ошибок;● Настройка “по ресурсу” и “по verb’u”:

○ Аутентификация;○ Пермишены;○ Формат;

● Множество ресурсов “по умолчанию”:○ Универсальный для любой content entity;

REST module

Page 29: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Предоставляет возможность создавать endpoint’ы;● Можно прикреплять к endpoint’ам ресурсы и настраивать их;

● Например: /v1/node/{node}

Services module

Page 30: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● JSON API○ Стандарт;○ Формат - JSON;○ Не hal_json, но при этом поддерживает hal;

JSONAPI

Page 31: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Модуль○ Предоставляет набор ресурсов “по умолчанию”, включая

универсальный;○ Предоставляет коллекции;○ Нет UI;○ Не связан с модулем REST;○ Нет настройки “по ресурсу”;○ Сложности с кастомными ресурсами;○ Нестабилен при работе с file_entity и другими кастомными

нормализаторами;

JSONAPI module

Page 32: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Связан с REST;● Предоставляет несколько REST-ресурсов для получения данных о

структуре сущностей;● Нужен для работы одноименных фронтенд-библиотек.

WATERWHEEL module

Page 33: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Является частью DrupalDeploy;● Зависим от REST;● Предоставляет улучшенную поддержку:

○ Ревизионности;○ Мультиязычности;○ Связями через uuid;○ Работы с файлами;

■ Multipart;

RELAXED module

Page 34: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

● Формально с REST не связан;● Превращает файлы в сущности с возможностью добавлять поля;● Эти сущности можно создавать через REST;● Предоставляет нормалайзеры для работы с контентом файлов в

base64;● Нормалайзеры работают только с hal_json.

FILE_ENTITY module

Page 35: Правильное REST API в D8 - Евгений Юдкин, DrupalJedi

Evgeny Yudkin

Drupal [email protected] При поддержке:

Организаторы:

Thank you!