У меня есть веб-страница в формате мастера. Кнопка отправки в API будет на 4-м шаге мастера. Однако я хочу, чтобы введенные данные были сохранены в базе данных перед переходом к следующему шагу в мастере. Я также хочу, чтобы REST API работал для страниц, имеющих одну вкладку.
Поэтому я разработал API для параметра запроса action = draft или submit. Если действие является черновым, обязательны только определенные поля. Если действие отправлено, все поля являются обязательными. Проверки в сервисном уровне REST API будут выполняться на основе параметра запроса. Похоже, я должен явно указать условия if / else в документации. Это приемлемая форма дизайна RESTful? Какой будет лучший дизайн с этими требованиями?
Ответы:
Поскольку вы хотите сохранить вещи на сервере между шагами мастера, кажется вполне приемлемым рассматривать каждый шаг как отдельный ресурс. Что-то в этом роде:
Включив гиперссылки в ответ, вы можете проинформировать клиента о том, что он может сделать после этого шага - перейти вперёд или назад для промежуточных шагов, и ничего для последнего шага. Вы можете увидеть пример этого на рисунке 5 здесь .
источник
in_progress
илиdraft
.Некоторое время назад мне нужно было сделать нечто подобное, и ниже описывается, чем мы в конечном итоге занимаемся.
У нас есть две таблицы: Item и UnfinishedItem. Когда пользователь заполняет данные с помощью мастера, данные сохраняются в таблице UnfinishedItem. На каждом шаге мастера сервер проверяет данные, введенные на этом шаге. Когда пользователь завершает работу с мастером, мастер отображает скрытую / доступную только для чтения форму на странице подтверждения, которая показывает все данные, подлежащие отправке. Пользователь может просмотреть эту страницу и вернуться к соответствующему шагу, чтобы исправить ошибки. Когда пользователь удовлетворен своими записями, он нажимает кнопку «Отправить», и мастер затем отправляет все данные в скрытых / доступных только для чтения полях формы на сервер API. Когда сервер API обрабатывает этот запрос, он повторно запускает все проверки, которые он выполнял на каждом шаге мастера, и выполняет дополнительные проверки, которые не вписываются в отдельные этапы (например, глобальные проверки, дорогостоящие проверки).
Преимущества двухстолового подхода:
в базе данных вы можете иметь более жесткие ограничения для таблицы Item, чем для таблицы UnfinishedItem; вам не нужно иметь дополнительные столбцы, которые действительно потребуются после завершения работы мастера.
Агрегировать запросы по готовым Элементам для отчетности проще, так как вам не нужно помнить, чтобы исключить UnfinishedItems. В нашем случае нам никогда не требовалось выполнять агрегированные запросы между Item и UnfinishedItems, так что это не проблема.
Недостаток:
Другие возможности, которые я рассмотрел, и почему мы не пошли с ними:
источник
if
утверждений, проверяющих состояние черновика во всех ваших проверках, что было бы просто нехорошо. Хотя некоторые очень сложные фреймворки, такие как Ruby on Rails, могут значительно упростить эту проблему, если реализованы правильно.Я реализовал это способом, подобным сочетанию решений @ guillauma31 и @Lie Ryan.
Вот ключевые понятия:
/users/:id_user/profile/step_1
,..../step_2
, И т. Д.).../profile/confirm
. Этот ресурс не должен получать все данные снова. Он только помечает данные как правильные и полные.Ребята из внешнего интерфейса должны позаботиться о жетонах, чтобы заставить работать волшебника туда-сюда.
API не имеет состояния и атомарен.
Чтобы «мастер одного шага» работал с этой настройкой, вам нужно изменить некоторые вещи, такие как удаление потока токенов или создание ресурса для возврата токенов в зависимости от типа мастера, или даже создание нового ресурса только для заполнения этого конкретного шаг мастера (вроде
PUT /users/:id_user/profile/
).источник