2014-10-06 37 views
0

我的应用程序交易要求用户注册才能使用该服务,并且要他们创建应用程序。接口的初始计划如下...Rest API需要额外的操作 - 如何构造?

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,而不仅仅是获取和更新文档本身?

+1

对于激活,你有没有考虑过账到/用户/应用/ {ID}有例如IsActivated属性设置为true,更新的应用程序资源?然后,您可能需要在属性更改时处理事件,以便触发发送电子邮件等流程。 – elolos 2014-10-06 13:16:33

回答

2

This Martin Fowler的文章指出: 有些人错误地在POST/PUT和创建/更新之间建立了对应关系。他们之间的选择是相当不同的。

当我尝试PUT和POST我遵循一条规则之间作出选择:

PUT - >幂等

POST - >不是幂

幂等的意味着没有执行一个和多个操作之间的区别。在第一次操作之后以及在其他每次操作之后,DB数据将相同。

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

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

正在添加回到你的问题,在我看来,你正在使用的POST正确的不幂等动作,因为ActivateApplication多次调用会发送多封电子邮件。

编辑

由于@elolos曾这样评价,继单一责任原则,发送电子邮件应该是另一种责任没有直接联系的更新状态。当属性,以便触发像发送电子邮件过程将是一个更好的办法改变处理事件。这样ActivateApplication操作可以是幂等的,并使用PUT HTTP方法被调用。

+0

我同意PUT/POST比较。我不知道,允许多次启用好德兴不过,将垃圾邮件与同激活的多个副本HR部门是否可以接受? – elolos 2014-10-06 13:21:09

+0

@elolos你说得对。我按照你的方法编辑了我的答案。 – 2014-10-07 09:59:16