我希望使用HATEOAS来定义REST API。具体来说,我认为指示给定资源当前可用的操作非常有趣。
由于一些HATEOAS规范对我的需求过于繁琐,所以我在查看HAL规范,因为我发现它非常简洁实用:
{
_links: {
self: { href: "/orders/523" },
warehouse: { href: "/warehouse/56" },
invoice: { href: "/invoices/873" }
},
currency: "USD",
status: "shipped",
total: 10.20
}
然而,在HAL中,链接仅包含相关资源的列表,但不包括可用的操作。根据上面的例子,我现在是否可以取消订单,还是不能取消了?一些HAL示例通过使用特定的取消URL并且仅在可以取消时在响应中添加相应的链接来解决这个问题:
"cancel": { "href": "/orders/523/cancel" }
但这并不是很符合REST。取消不是资源。取消是一个资源的DELETE操作,即:
DELETE /orders/523
是否有一种优雅的方式可以使用HAL来表示这个问题,还是我应该使用其他的HATEOAS规范?
我正在考虑返回一个“取消”链接,其URL与self相同,但在这种情况下,客户端必须知道要使用DELETE动词来取消,这并没有在HATEOAS响应中得到描述。
self: { "href": "/orders/523" },
cancel: { "href": "/orders/523" }
这是否是符合HATEOAS/HAL建议的方法?我了解HAL没有任何“method”参数,而自己添加该参数将违反HAL规范。