HTTP-метод для небольших действий, таких как (до) голосования - PullRequest
10 голосов
/ 16 марта 2012

Глаголы довольно просты для действий CRUD.

Каким будет правильный HTTP-глагол только для выполнения действия, что-то как upvote?

Может быть, это больше говорит о моделировании данных? Upvote ресурс или просто атрибут? Я не уверен в этом. Допустим, он изменяет ресурс напрямую, вызывая #upvote в модели.

Например, если я поставлю здесь вопрос о SO, какой глагол должен идеально использоваться для этого действия? Я частично изменяю ресурс (PATCH?), Но в то же время я не хочу указывать новое значение, так как могу столкнуться с проблемами параллелизма, поэтому лучше всего будет управлять базой данных. Другими словами, мы хотим попросить сервер выполнить инкрементное действие над ресурсом. Это покрыто PATCH?

Я видел похожий вопрос, заданный там , но их случай указывал на создание нового ресурса, рассматривая запрос задания как объект, который будет создан. Мы в одном и том же случае здесь?

Если бы метод PATCH действительно был бы уместен, что бы он содержал?

1 Ответ

7 голосов
/ 16 марта 2012

Может быть, это больше говорит о моделировании данных?Является ли upvote ресурсом или просто атрибутом?

Моделирование воздействий Реализация

Обычно мы моделируем что-то из реального мира, и наш выбор представления серьезно повлияет на возможности развитогосистема.Мы могли бы реализовать наше голосование двумя способами: как признак того, за что голосовали, или как отдельное лицо.Выбор повлияет на то, насколько легко мы сможем реализовать нужные функции.


Два возможных варианта реализации ...


1.Голосует как субъекты

Я бы смоделировал это с ресурсом, который моделировал отношения между избирателем и предметом, за который проголосовали.Почему?

Голосование имеет состояние :

  • , за что проголосовали
  • , который проголосовал,
  • , когда сделалони голосуют.
  • - это был голос "за" или "за" (вы упомянули SO в качестве примера, поэтому я включаю эту возможность здесь)

Это ресурс сам по себе с интересное поведение вокруг голосов

  • вести правильный подсчет голосов
  • предотвращать множественное увеличение / уменьшение голосов


Это можно легко смоделировать с помощью REST .

Я могу ПОСТАВИТЬ / ПОСТАВИТЬ новый голос, УДАЛИТЬ предыдущий голос, проверить мои голоса квалифицированным GET.

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


2.Голоса как атрибут

В этой реализации мы моделируем голосование как счетчик.В этом случае нам нужно

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

  2. Обновление счетчика

  3. Вернуть обновленное состояние - упс, кто-то уже обновил ресурс за это время!

СерверТеперь нет простого способа обрабатывать несколько голосов от одного человека, не управляя каким-либо государством «на стороне».У нас также есть проблема с «потерянным обновлением».

Все быстро усложняется.


Окончательный совет

Решение о том, как вы смоделируете что-либо, должно зависеть от того, что вам нужно для работы системы.

Часто нет правильного решения, просто лучший компромисс между усилием и ценностью .

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


Крис

...