REST-архитектура

REST-архитектура #

Васильев Андрей Михайлович, 2024

Версии презентации


Реализация распределённых приложений #

  • Как организовать связь между удалёнными системами?
  • Как обратиться к удалённой системе?
  • В каком виде формировать запросы к системе?
  • Как должен быть устроен клиент, чтобы выполнить запрос?

Существует множество технологий, которые позволяют решить данную задачу: REST, SOAP, gRPC и т.д.

Рассмотрим в качестве технологии описания маршрутов REST:

  • Является достаточно распространённой
  • Основана на использовании особенностей протокола HTTP
  • Обычно использует JSON как средство передачи данных

REST #

REST — акроним Representational State Transfer, передача репрезнтативного состояния

Представляет собой некоторый набор рекомендаций, которым может следовать HTTP-сервер для предоставления возможностей удалённому клиенту

  • Не является точной спецификацей
  • Правила разработаны одним из создателей протокола HTTP
  • Службы, соответствующие правилам, называются RESTful

Правила REST #

Отделение клиента от сервера #

Код запросов формируется на клиенте, а код по обработке запроса — на стороне сервера

Позволяет независимо менять реализации сервера, реализовывать множество независимых клиентов

Отсутствие записи состояния клиента #

Сервер не хранит информацию о текущем состоянии (или списке операций) клиента

Клиент должен передаёт все данные, которые нужны для выполнения запроса

Кэширование #

Сервер может пометить, что результат запроса может быть закеширован на клиенте, таким образом может быть уменьшено число запросов

Например справочник названий населённых пунктов не будет часто меняться


Единообразие интерфейса #

Обращение к ресурсам сервера должно быть выстроено на единых принципах

  • Данные передаются по протоколу HTTP
  • В качестве данных ответа всегда возвращается JSON или XML

Многоуровневость системы #

Сервер может быть организован достаточно сложно, но клиенты (даже в рамках сервера) всегда взаимодействуют с одним конкретным сервером, который может уже далее выполнять свои запросы для решения задачи

Код по требованию #

Сервер по требованию может отправить исходный код, который может быть исполнен на клиенте, например для выполнения сложных запросов к данным сервера

Не является обязательным для реализации


Сетевые ресурсы #

REST не определяет никаких методов для доступа к удалённым ресурсам, вместо этого применяется комбинация из других протоколов: HTTP, URI, JSON и XML

При формировании серверов, предоставляющих доступ к данным с помощью REST рекомендуется следовать правилам, ориентированным на ресурсы

  • Ресурс — это часть данных, например данные о пользователе
  • Коллекция — это группа ресурсов, например список пользователей
  • URI определяет местоположение ресурса или коллекции, например /users
  • Операции над ресурсами определяются с помощью методов протокола HTTP
  • Результат выполнения операции описывается с помощью кодов ответа HTTP

Методы HTTP #

Над сетевыми ресурсами можно выполнять операции создания, чтения, модификации и удаления (анг. CRUD), данные операции удобно описываются с помощью HTTP-методов:

  • POST — создание нового ресурса
  • GET — получение существующего ресурса
  • PUT — обновление существующего ресурса
  • PATCH — частичное обновление путём обновления полей ресурса
  • DELETE — удаление существующего ресурса

Запросы на изменение данных на сервере (POST, PUT, PATCH, DELETE)

  • Не должны кэшироваться на промежуточных серверах
  • Передают данные в основном в теле запроса, а не в параметрах

Если необходимо выполнить операцию, изменяющую состояние на сервере, и не входящую в набор CRUD, необходимо использовать POST-запрос


Описание путей к ресурсам #

Из описания пути должно быть понятно количество ресурсов по пути:

  • Для одиночного ресурса используйте единственное число: /profile
  • Для коллекции используйте множественное число:
    • /users для получения всего списка
    • /users/{userId} для получения элемента из списка по идентификатору
  • Рекомендуется всегда начинать путь с ресурса, а заканчивать идентификатором

Примеры запросов

  • GET /courses/5/classes — получить список предметов у 5-го курса
  • DELETE /courses/4/classes/2 — удалить предмет 2 у 4-го курса
  • POST /courses — создать новый курс и получить его идентификатор
  • PUT /courses/6 — обновить данные для 6-го курса

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

Любые серверные приложения со временем развиваются, в них появляется новая функциональность, а старая функциональность становится не актуальной, либо сложной в поддержании

Соответственно на самом верхнем уровне рекомендуется добавлять явный номер:

  • /v1/users/
  • /v2/courses

Таким образом разработчик может ввести новый API, предоставляя возможность клиентам перейти на новый API:

  1. Сначала вводится новый API в экспериментальном режиме
  2. Затем он стабилизируется, изменения после этого должны быть обратно совместимы
  3. Старый интерфейс помечается как устаревший, клиентам рекомендуется перейти на новую версию
  4. По прошествии времени старый интерфейс убирается из системы

Документирование #

В оригинальном предложении относительно REST-архитектуры предлагалось возвращать документы, в которых явно отображены действия, которые пользователь может сделать

При работе с гипертекстом (HTML) так и происходит, т.к. пользователь видит интерактивные элементы и может выбрать действие для своего выполнения

  • При возвращении JSON-документов не сложилась практика по предоставлению этой информации внутри самих документов
  • Рекомендуется предоставлять документацию клиентам в одном из общепринятых стандартов: API Blueprint, Open API и т.д

Тестирование REST-приложений #

Для выполнения сквозного тестирования (end-to-end) можно воспользоваться

  • Самостоятельно написанными инструментами, http4k позволяет легко описать последовательность клиентских запросов
  • Воспользоваться существующими инструментами
    • Приложения с командным интерфейсом: curl, Hurl, HTTPie и т.д
    • Приложения с графическим интерфейсом: Postman, Bruno и т.д.
    • Расширения или встроенные средства сред разработки
  • При наличии описания в одном из стандартных форматах, можно воспользоваться соответствующими инструментами, которые могут использовать эти данные для выполнения тестирования

© A. M. Васильев, 2024, CC BY-SA 4.0, andrey@crafted.su