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

23

我正在重写一个旧的Rails应用程序,并且想以RESTful的方式进行,即使只是为了学习经验。

我已经实现了一些切换布尔值的操作,例如发布或取消文章发布。

之前我有几个动作:toggle_published、publish和unpublish。

它们非常容易使用:我只需在文章列表中创建指向它们的链接。

如何以RESTful的方式完成相同的操作?

我应该使用update动作,并建立一个小表单来替换之前使用的每个链接吗?我不是特别喜欢这个想法。

4个回答

50

提醒一下:

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

如果您想使其符合RESTful标准,应创建两种方法:一个用于设置,另一个用于取消设置。

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


确实,HTTP PUT 应该是幂等的。但 REST 不仅仅是 PUT。还有 HTTP POST,它不需要是幂等的。 - Paulo Merson
1
当然,但POST通常与创建相关联。 - Van der Hoorn

26

我可能会使用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。


2

看起来你有两个用例:

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

你应该能够为切换操作添加一个成员路由:

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

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

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

0

我喜欢@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

注意:
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`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接