我正在重写一个旧的Rails应用程序,并且想以RESTful的方式进行,即使只是为了学习经验。
我已经实现了一些切换布尔值的操作,例如发布或取消文章发布。
之前我有几个动作:toggle_published、publish和unpublish。
它们非常容易使用:我只需在文章列表中创建指向它们的链接。
如何以RESTful的方式完成相同的操作?
我应该使用update动作,并建立一个小表单来替换之前使用的每个链接吗?我不是特别喜欢这个想法。
我正在重写一个旧的Rails应用程序,并且想以RESTful的方式进行,即使只是为了学习经验。
我已经实现了一些切换布尔值的操作,例如发布或取消文章发布。
之前我有几个动作:toggle_published、publish和unpublish。
它们非常容易使用:我只需在文章列表中创建指向它们的链接。
如何以RESTful的方式完成相同的操作?
我应该使用update动作,并建立一个小表单来替换之前使用的每个链接吗?我不是特别喜欢这个想法。
提醒一下:
切换方法不符合RESTful标准,因为HTTP PUT动词应该是幂等的(参见http://en.wikipedia.org/wiki/Idempotence#Examples)。这意味着无论您执行多少次方法,它都应该始终给出相同的结果。切换方法不遵循此原则,因为如果您执行一次与执行两次,则结果不同。
如果您想使其符合RESTful标准,应创建两种方法:一个用于设置,另一个用于取消设置。
使应用程序符合RESTful标准并不仅意味着您应该使用正确的HTTP动词。
我可能会使用PUT / DELETE或嵌套的 "toggle 资源" 上的POST / DELETE 来解决它。也许不是完全符合RESTful规范,但肯定足够容易理解。
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。
看起来你有两个用例:
你应该能够为切换操作添加一个成员路由:
/articles/<id>/toggle_published - calls Article.toggle(:published)
使用标准REST资源路由通过文章更新 :published 属性。
map.resources :articles, :member => :toggle
我喜欢@Van der Hoorn的回答
所以在现实生活中,我们在登录和注销场景中使用它
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
/book/4
补丁请求和有效负载数据。Editor -> can access urls like `/books/:id` & `/books/:id/publish`
Senior Editor -> can access urls like `/books/:id` & `/books/:id/unpublish`
HTTP PUT
应该是幂等的。但 REST 不仅仅是PUT
。还有HTTP POST
,它不需要是幂等的。 - Paulo Merson