【问题标题】:Rest API needs additional operations - how to structure?Rest API 需要额外的操作——如何构造?
【发布时间】:2014-10-06 07:57:57
【问题描述】:

我的应用程序交易要求用户在使用该服务之前进行注册,并为此创建一个应用程序。界面初步规划如下...

POST /Users/Applications - 创建一个应用程序并返回一个唯一标识符。

GET /Users/Applications/{id} - 检索现有应用程序。

PUT /Users/Applications/{id} - 更新现有应用程序。

DELETE /Users/Applications/{id} - 删除现有应用程序。

这看起来非常干净和合乎逻辑,并且充分利用了 HTTP 动词。但是,如果我现在需要对应用程序执行其他操作,例如

  • ActivateApplication - 使用 PUT 将所有数据放入系统后,我现在希望用户激活他们的应用程序。这不仅仅是使用 PUT 更新应用程序状态的问题,还应该执行几项额外的工作来激活应用程序,例如向 HR 部门发送电子邮件。通知他们一个新的应用程序已经到了。

  • PrintApplication - 从客户端调用时,将应用程序打印到办公室打印机。 (不是一个理想的例子,但我敢肯定你明白了!)

我将如何构建我的 REST 接口来处理这种类型的请求?也许是这样的......

POST /Users/Applications/{id}/print

POST /Users/Applications/{id}/activate

...为了激活,我正在改变状态,所以我相信我需要使用 POST。我知道 REST 是关于文档的,但是当我需要对文档执行操作时,我如何构建我的 API,而不仅仅是获取和更新文档本身?

【问题讨论】:

  • 对于激活,您是否考虑过向 /Users/Applications/{id} 发布更新的应用程序资源,例如 IsActivated 属性设置为 true?然后,您可能需要在属性更改时处理事件以触发发送电子邮件等流程。

标签: rest asp.net-web-api asp.net-web-api2


【解决方案1】:

ThisMartin Fowler 的文章指出: 有些人错误地在 POST/PUT 和 create/update 之间建立了对应关系。他们之间的选择与此大不相同。

当我尝试在 PUT 和 POST 之间做出决定时,我遵循下一条规则:

PUT -> 幂等

POST -> 非幂等

幂等意味着执行一个和多个操作之间没有区别。 DB数据在第一次操作之后和其他每个操作之后都是一样的。

在非幂等操作的情况下,每次执行的操作都会更改数据库中的数据。

这就是为什么 PUT 通常用于 UPDATE 操作而 POST 用于 CREATE。但这不是正确的规则。

回到您的问题,我认为您正确使用 POST 作为非幂等操作,因为多次调用 ActivateApplication 将发送多封电子邮件。

已编辑

正如@elolos 所评论的那样,根据单一责任原则,发送电子邮件应该是与更新状态没有直接关联的另一种责任。 在属性更改时处理事件以触发发送电子邮件等流程将是更好的方法。这样ActivateApplication操作可能是幂等的,使用PUT Http方法调用。

【讨论】:

  • 我同意 PUT/POST 比较。我不确定允许多次激活是否是好的设计,是否可以接受向人力资源部门发送多个相同激活副本的垃圾邮件?
  • @elolos 你是对的。我已经按照你的方法编辑了我的答案。
猜你喜欢
  • 2012-06-22
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多