Лучший способ реализовать RESTful toggle-action? - PullRequest
12 голосов
/ 16 июля 2010

Я делаю переписывание старого приложения на Rails, и я подумал, что должен сделать это RESTful способом, как опыт обучения, если ничего больше.

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

До того, как у меня было несколько действий: toggle_published, publish and unpublish.

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

Как бы вы поступили так же RESTful способом?

Должен ли я использовать действие обновления и создать мини-форму для замены каждой ссылкичто я использовал раньше?Мне не нравится эта идея.

Ответы [ 4 ]

30 голосов
/ 17 февраля 2011

Просто замечание:

Метод переключения не является RESTful, потому что глагол HTTP PUT должен быть идемпотентным (см. http://en.wikipedia.org/wiki/Idempotence#Examples).) Это означает, что независимо от того, как часто вы выполняете метод, он всегда должен давать один и тот же результат. Метод переключения не придерживается этого принципа, поскольку он не дает того же результата, если вы выполняете его один раз по сравнению с выполнением его дважды.

Если вы хотите сделать этоRESTful, вы должны создать два метода: один для установки и один для сброса.

Создание приложения RESTful не только означает, что вы должны использовать правильный HTTP-глагол.

11 голосов
/ 11 апреля 2012

Я бы, вероятно, решил это с помощью PUT / DELETE или POST / DELETE на вложенном «переключаемом ресурсе». Возможно, не полностью спокойный, но достаточно легкий для понимания.

PUT or POST /articles/:id/published # Toggle published ON

DELETE /articles/:id/published # Toggle published OFF

GET /articles/:id/published # Get state RESTfully via status 200 (ON) or 404 (OFF)

Может показаться немного странным, но это технически ОТДЫХ.

Обновление: (возможно) более естественный подход также может быть:

PUT or POST /articles/:id/published Data: { state: true/false } # Toggle published ON

Вы также можете использовать глагол PATCH с самой статьей, которая, как я полагаю, имеет свойство published:

PATCH /articles/:id { published: true/false }

Потому что в наши дни все крутые дети REST используют PATCH.

1 голос
/ 17 июля 2010

Похоже, у вас есть два варианта использования:

  • установить опубликованное состояние
  • переключить опубликованное состояние

Вы должны иметь возможность добавить участникаМаршрут для действия переключения для:

/articles/<id>/toggle_published - calls Article.toggle(:published)

И использовать Обновление статьи для: опубликованного атрибута через стандартный маршрут ресурса REST.

map.resources :articles, :member => :toggle
0 голосов
/ 08 сентября 2018

Мне нравится @Van der Hoorn answer

, поэтому в реальной жизни мы используем сценарий входа в систему и выхода из системы

use post or put or patch

/users/login -> with some payload data    

/users/logout

В вышеприведенном примере вход и выход из системы почти действуют какустановка логического флага, легко читаемого и установленного в дБ

Например: поэтому не вредно использовать ту же идею в контексте переключения

 use post or put or patch

/book/3/publish     

/book/4/unpublish

Примечание.:

1: используйте этот подход, если нужно переключить только 1 поле, в противном случае, если имеется несколько полей, тогда общий /book/4 запрос исправления с данными полезной нагрузки будет выполнять

2: использоватьэтот подход, если существует какой-либо уровень безопасности, будет реализован так:

Например:

Editor ->         can access urls like `/books/:id` & `/books/:id/publish`

Senior Editor ->  can access urls like `/books/:id` & `/books/:id/unpublish`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...