实现RESTful切换操作的最佳方法是什么?

时间:2010-07-16 15:13:22

标签: ruby-on-rails rest

我正在重写一个旧的Rails应用程序,我认为我应该以RESTful方式进行,作为一种学习经验,如果没有别的。

我已经达成了一些切换布尔值的操作,例如,如果文章是否已发布。

在我做了几个动作之前:toggle_published,发布和取消发布。

它们非常易于使用:我只是在文章列表中找到了它们的链接。

你会如何以RESTful方式做同样的事情?

我应该使用更新操作,并构建一个迷你表单来替换之前使用的每个链接吗?我并不特别喜欢这个想法。

4 个答案:

答案 0 :(得分:27)

只是一个通知:

toggle方法不是RESTful,因为HTTP PUT动词应该是幂等的(参见a.o. http://en.wikipedia.org/wiki/Idempotence#Examples)。这意味着无论您多久执行一次方法,它都应该始终给出相同的结果。切换方法不遵循这一原则,因为如果执行一次与执行两次相比,它不会产生相同的结果。

如果你想让它成为RESTful,你应该创建两个方法:一个用于设置,一个用于取消设置。

使应用程序RESTful不仅意味着您应该使用正确的HTTP动词。

答案 1 :(得分:10)

我可能在嵌套的“切换资源”上使用PUT / DELETE或POST / DELETE来解决它。也许不是100%完全宁静,但肯定很容易理解。

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)

可能看起来有点奇怪,但它在技术上是RESTful。

更新:一种(也许)更自然的做法也可能只是:

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

您还可以将PATCH动词与我认为具有published属性的实际文章一起使用:

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

因为现在所有很酷的REST小孩都在使用PATCH。

答案 2 :(得分:1)

听起来你有两个用例:

  • 设置已发布状态
  • 切换已发布状态

您应该能够为以下内容添加切换操作的成员路径:

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

使用文章更新:发布属性通过标准REST资源路由。

map.resources :articles, :member => :toggle

答案 3 :(得分:0)

我喜欢@Van der Hoorn的答案

所以在现实生活中,我们在登录和注销场景中使用

use post or put or patch

/users/login -> with some payload data    

/users/logout

在上述示例中,登录和注销几乎就像设置boolean Flag一样,易于读取并在db中设置

例如:因此在切换上下文中使用相同的想法没有害处

 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`