• Блог
  • RESTful API в MODX не RESTful

Как вы уже поняли из заголовка, в MODX нельзя реализовать полноценный RESTful API. Давайте попробуем разобраться почему. Для начала посмотрим определение REST архитектуры.

Термин REST расшифровывается как Representational State Transfer, что в переводе означает «передача состояния представления». Это архитектурный стиль взаимодействия компонентов распределённого приложения в сети.

И Рой Филдинг, автор этой концепции, описал ряд необходимых требований для построения распределённых REST-приложений. Их всего 6:

  1. Клиент-сервер.
  2. Отсутствие состояния.
  3. Кэширование.
  4. Единообразие интерфейса.
  5. Слои.
  6. Код по требованию.

Мы не будем рассматривать все эти требования, а обратим свой взор на второй пункт. Он, в отличие от других, самый дискуссионный. Сколько в инете вопросов и обсуждений по нему и не сосчитать. И в нашем случае именно он и является камнем преткновения. Давайте разберемся, что с ним не так.

Отсутствие состояния, или Stateless по ихнему, требует, чтобы сервер получал всю необходимую для обработки запроса информацию от клиента. Т.е. он, сервер, не должен хранить какую-либо информацию о состоянии клиента между запросами.

В связи с этим, использование механизма сессий на сервере нарушает концепцию REST. Википедия нам говорит, что своё состояние клиент должен хранить сам и передавать его на сервер вместе с запросом. Это особенно значимо в случае использования балансировщиков. Иначе на разных серверах данные могут отличаться. Вот такая теория.

Конечно, я не думаю, что кто-то решит построить высоконагруженную систему на MODX. Поэтому можно было бы забить на это требование, если бы сессия использовалась только для аутентификации пользователя. Но тут вылезает другая проблема, описанная мной в этой статье. И принцип REST рушится даже без балансировщиков. Представьте, работает некий пользователь с сайтом. И вы решаете удалить этого пользователя из одной группы и добавить в другую, чтобы изменить права доступа. А этот пользователь переходит за другой комп или начинает работать с мобильника. Он логинится и с этого момента на один и тот же запрос с разных устройств сервер будет отдавать разный результат. А это уже нарушение главного правила REST — один и тот же запрос должен всегда выдавать одинаковый результат.

Но сессии используются не только в ядре для юзеров. Ряд приложений используют сессию как при работе в админке, так и во фронте. Сам грешен.

В общем, решение напрашивается одно — не использовать сессию. Андрей Чирко предложил свой вариант на Symfony. Он вообще не использует MODX, а сессии работают на JWT. Но его решение не доработанное. Оно не позволяет работать полноценно. Т.е. кто-то должен через админкку наполнять таблицы с данными. Да и GET-запросы простые, без проверки прав. Нужно пилить и пилить. Но насколько я понял, Андрей этого делать не будет.

А если работать с MODX, но без сессии, то придётся переписывать всё ядро, что равносильно созданию новой системы. Хотя есть ещё вариант — поступить как разработчики MODX, т.е. сделать RESTful API, который на самом деле не REST. Но лично я не вижу в этом никого профита для себя.

Вот такое положение дел. У кого есть что добавить, пишите, не стесняйтесь.

0   363

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

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.