遵循 HATEOAS 原则,每个状态都应该是超链接的,对改变资源状态的链接进行建模的最佳方法是什么?
让我们以订单为例:
{
id : 12,
state: 'pending',
...,
links: [
...,
{
rel: 'cancel',
href: '/orders/12/cancel'
},
...
]
}
我对“/取消”部分并不完全满意 - 如果我可以发送带有内容的“PUT”请求,我会感觉好多了:
{
status:'cancelled'
}
但是我如何在链接部分用“href”属性表示呢?我想在那里表示可用的操作,例如,取消订单并不总是可能的(“完成”状态)。
一种可能性是使用像“/orders/12?action=cancel”这样的 URL,这有点像 RPC 方法,我错过了一些东西。
另一种看起来可能最好的可能性是有这样的链接:
{
rel: 'cancel',
href: '/orders/12/',
type: 'PUT',
values: {
state: 'cancelled'
}
}
这个解决方案可能感觉有点冗长。
任何想法如何优雅地处理?也许有人已经解决了类似的“问题”?
最佳答案
建模资源是 REST 中最困难的部分。严格遵守标准意味着如果您看到自己曾经这样做过:/resource/:id/{action}
,您违反了“正确使用 HTTP”标准,因为理想情况下,您的端点应该始终是“名词”,而不是“动词”(动词是 HTTP 协议(protocol)提供的)。
因此,虽然“视情况而定”(即设计资源的困难部分),但通常:
对象模型状态本身可以被视为资源 .
这意味着,您的订单状态实际上是您可以查询的资源(作为独立的 /orderstatuses
资源或作为子资源,例如 /orders/:id/status
)
您的应用程序状态现在可以根据订单本身的当前状态链接到状态资源。如果您的“状态”架构看起来像这样(伪):
key: 'status'
values: ['pending', 'cancelled']
然后您的应用程序可以
PUT /order/:id/status {status:'cancelled'}
(格式良好的状态)返回 API,然后它会采取行动取消您的订单。用这些术语来说有点奇怪(RPC 更直观),但希望这会有所帮助。
关于rest - HATEOAS - 如何为改变状态的链接关系建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17529315/