ServiceStack:使用单个路由在资源上执行多个业务流程

时间:2013-03-27 15:53:44

标签: rest servicestack

我的团队正在为处理物理资产跟踪的现有企业应用程序设计REST API。

我们的域名模型非常复杂,我们在设计路线时遇到阻塞问题。

理想情况下,我们希望每个资源都支持多个业务流程。但是,如果不扩展资源的URL来帮助ServiceStack的路由引擎找出要使用的DTO,我们就找不到办法做到这一点。

这是一个例子。我们会详细记录涉及窗口小部件的事务,并且用户可以在我们使用不同类型的事务表示的窗口小部件上执行多种类型的操作。例如,可以检查widget,或者可以清除它。两者都是针对/api/widget/{id}的操作,但第一个导致检查事务,第二个导致维护事务。我们真的想创建使用相同路径/api/widget/{id}的不同DTO,并根据请求正文选择正确的DTO。

这似乎不可能。相反,看起来我们需要创建两个端点:/api/widgets/{id}/inspect/api/widgets/{id}/clean,或类似的东西。

这感觉不太RESTful,因为它离/api/cleanWidget不远。它更像是一种方法调用,而不是对资源的更新。

我们讨论的另一个选项是创建单个/api/transactions端点,因为对API的大多数请求都会导致创建事务。但是,这将导致单个整体端点,并且用户必须弄清楚他们需要为给定类型的请求填充数十个可能的数据属性中的哪一个。它与我们的用户将要编程的用例相去甚远。他们更关心他们与之交互的物理实体,而不是我们的幕后实现。

两个问题:

  1. 我们是否错误地考虑了这个问题?有没有更好的方法以RESTful方式对其进行建模?
  2. 如果我们的想法合理,在确定满足请求时要使用哪种DTO和服务方法时,是否有一种使用ServiceStack来考虑请求体的好方法?

1 个答案:

答案 0 :(得分:4)

/api/widgets/{id}/inspection怎么样?如果您将它PUT它,您可以开始检查,如果您获得它,您可以获得检查状态。

如果您有更多的检查同时运行(使用您提到的事务),可以设想一个模式,您可以在/api/widgets/{id}/inspections进行POST,以便在/api/widgets/{id}/inspections/{id}/创建新的检查。在这里你可以GET查看状态,DELETE取消等等。

如果您想根据邮件正文确定URL,一个想法是拥有/api/widgets/{id}/transactions资源,您可以在其中发布邮件。如果身体要求检查,该资源可以解析身体并返回201,引用/api/widgets/{id}/inspections/{id}/,或者如果身体要求清洁,则返回/api/widgets/{id}/cleanings/{id}/

这只是一些想法。顺便说一句,您可能希望看一下RESTify DayTrader的灵感。