RESTful CRUD для одной или нескольких служб

Если у меня есть простая структура данных, для которой потребуется только одна служба (formular) для обработки связанных данных в других таблицах (formgroups, fields) .

  1. Как отличить, это операция обновления или операция создания с новыми вставленными в структуру данными? (что-то вроде идентификатора, который равен нулю или нет?)
  2. Используете один или несколько сервисов?

Структура данных:

{
    "id": 7
    "name": "Formular name",
    "formgroups": [
        {
            "id": 28,
            "formularId": 7
            "name": "General",
            "fields": [
                { "name": "Firstname", "id":107, "formgroupId":28 },
                { "name": "Lastname", "id":108, "formgroupId":28 },
                { "name": "Birthdate", "id":111, "formgroupId":28 }
            ]
        },
        {
            "name": "Address; new group with new fields",
            "fields": [
                { "name": "Street"},
                { "name": "Zip"},
                { "name": "Country"}
            ]
        },
        {
            "name": "Additions",
            "fields": [
                { "name": "First Line"},
                { "name": "Second Line"}
            ]
        }
    ]
}

Если бы с одной службой (/ formular), я бы отправил ей всю структуру данных, и мне нужно было бы различать элемент с id, чтобы он сделал запрос на обновление, или если у него нет его , создайте запись с соответствующим родительским идентификатором.

Выполнение этого в одном сервисе нарушит принцип единственной ответственности. Потому что у меня есть логика из группы форм и поля в моем сервисе формул.

Также я не уверен, работают ли крючки «до» и «после» с ассоциациями продолжения перьев. Возможно, их обошли стороной.

При работе с несколькими службами (/ formular, / formgroup, / field) выполняется та же проверка для id, но клиентское приложение отправляет каждую службу с помощью PUT / PATCH или POST.

PATCH / formular / 7

ПАТЧ / formgroup / 28

ПАТЧ / поле / 108

POST / formgroup (вставьте с формульным идентификатором 7 и получите обратно идентификатор formgroup 29 для следующей вставки поля)

POST / поле (вставьте "Street" с идентификатором группы форм 29)

POST / поле (вставьте 'Zip' с идентификатором группы форм 29)

...

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

Третий способ может заключаться в использовании всех служб, но никогда не раскрывать их все. Отправка структуры данных дыры в / formular service, где она вызывает внутри другие службы / formgroup и / field для операций CRUD. Но я не знаю, работает ли это по-прежнему с функцией крючков и функцией продолжения перьев.

Модель взаимоотношений между сущностями.

модель отношений сущностей

Исходный код моего тестового проекта можно найти здесь: https://github.com/Orbitkorbi/feathers-sequelize-test

Дополнительная информация о приложении: мое приложение разделено на две части.

  1. Серверное приложение, на котором запущены перышки и предоставляют REST API со своими службами.
  2. Клиентский SPA, работающий в браузере, совершающий вызовы API.

Вопрос: Как это сделать в отношении сервисов, хуков, отношений сиквелизации и RESTful API?


person orbitkorbi    schedule 27.09.2020    source источник


Ответы (1)


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

Третий способ может заключаться в наличии всех служб, но никогда не раскрывать их все. Отправка структуры данных дыры в / formular service, где она вызывает внутри другие службы / formgroup и / field для операций CRUD.

Этот подход наиболее соответствует REST.

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

Каждый документ на вашем веб-сайте не зависит от других, и изменения в этот документ можно предлагать с помощью сообщений с самоописанием, которые являются общими для всех документов.

Следовательно

PUT /formular

Это совершенно разумный способ предложить серверу сделать его копию /formular похожей на копию клиента.

Затем сервер отвечает за (а) определение того, как он хочет изменить свою копию ресурса в ответ на запрос, и (б) выяснение того, как внести эти изменения.

Итак, если / formular - это ресурс, построенный из нескольких строк в нескольких таблицах, серверу нужно будет выяснить, какие операторы базы данных потребуются для соответствующего обновления этих таблиц.

Эта сложность намеренно скрыта за фасадом REST - с точки зрения клиента, вы просто записываете новое представление ресурса в какой-то файл.


Что касается принципа единой ответственности, у обработчика запросов одна обязанность - обрабатывать запрос. Вероятно, вы захотите реализовать это, попросив обработчика запросов делегировать часть или всю работу более простым вещам.

(Например, анализ HTTP-запроса, создание HTTP-ответа и т. Д.)

person VoiceOfUnreason    schedule 27.09.2020
comment
Я не знаю крючков или перьев-сиквелизов, поэтому я не могу начать догадываться, как они могут помочь (или как они могут мешать). - person VoiceOfUnreason; 27.09.2020
comment
Спасибо. Ваш ответ очень помог очистить воздух. У меня в голове было слишком много разных вещей, таких как SOA, ORM, REST, и я смешал их вместе, сопоставив друг с другом, что в конечном итоге сильно сбило меня с толку и привело к потере зрения. Теперь все рассортировано благодаря тебе. - person orbitkorbi; 02.10.2020