我正在重写一个旧的Rails应用程序,我认为我应该以RESTful方式进行,作为一种学习经验,如果没有别的。
我已经达成了一些切换布尔值的操作,例如,如果文章是否已发布。
在我做了几个动作之前:toggle_published,发布和取消发布。
它们非常易于使用:我只是在文章列表中找到了它们的链接。
你会如何以RESTful方式做同样的事情?
我应该使用更新操作,并构建一个迷你表单来替换之前使用的每个链接吗?我并不特别喜欢这个想法。
答案 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`