【发布时间】:2015-05-25 13:52:45
【问题描述】:
我有一个具有多个属性的实体,比如«project»。除了简单的属性,项目可能有一个«状态»列表,其中最后一个是当前的。我有一个 Web 表单来创建/编辑项目。该项目的所有属性都可以在此表单中更改,用户也可以为项目添加新状态(但不能更改或删除旧状态)。
项目状态是纯粹的复合实体,它们在项目范围之外没有任何独特的意义或身份,也不能直接解决,因此它们显然不值得一个特殊的根 REST 资源。
根据 REST 架构,我创建了一个名为 /projects 的资源。 POST 用于创建新项目,PUT 用于更改现有项目。
但是,我不希望客户将项目及其所有历史状态放在一起,首先是因为这个集合太重了,其次是因为业务逻辑只允许添加状态,而不是更改或删除它们,所以无论如何,将项目及其所有状态放在一起没有任何意义。
PUT 一个只有新状态的项目也不是一种选择,因为它违反了 PUT 的幂等性。
我也不喜欢在第二个 HTTP 请求中发布状态的想法,比如 /project/{id}/status,因为从用户的角度来看,这会破坏更新操作的原子性。如果第二个请求在网络上丢失,那么项目对于编辑它的用户将显得不一致(属性已更改,但状态保持不变)。对于更新看似单一的实体这一简单任务,创建 RESTful “事务”似乎有点过头(而且容易出错)。
这种问题在我的工作中非常普遍,可以概括为:更新业务逻辑只允许部分更新的复杂复合实体的 REST 完全正确和原子方式是什么?
【问题讨论】: