我一直在做RESTful API(暴露和消费第三方),我看到两个以下的模式在这里和那里出现。每个都有利有弊,而且#34;清洁"在我看来。
所以情况是:你有一个集合资源(例如" assets")并且你想在集合中暴露一些额外的资源(例如集合本身的子资源,而不是资产,比如聚合视图端点或一些命令)。
我看到的两种模式是:
人们创建一个RESTful集合资源,如/assets/${asset-id}
,并公开他们需要的所有其他内容,如GET /assets/owned
,GET /assets/summary
,POST /assets/recheck-inventory
。这看起来简洁明了,但引入了${asset-id}
与子资源网址名词之间的冲突(例如asset12345
和summary
位于网址中的相同位置。)
其他人/assets/items/${asset-id}
并公开GET /assets/owned
,GET /assets/summary
等所有内容。从路由角度来看这更清晰,更具有前瞻性,但在路线中添加了一个额外的名词,例如当人们试图POST /assets
时会导致混淆。
"最佳实践"到目前为止我经历的指导方针完全避免了这个问题。我也明白,REST是一种惯例,而不是标准,而且还有一种普遍的"它取决于"回答。不过,我觉得这里必须有一个通用的推荐。
因此问题是:你会使用哪两个?
更新:澄清一下,让我们假设:
/assets/owned
包含不同类型的实体,而不是资产,因此它不是查询,您可以在其中获取/发布/删除项目。/assets/summary
是一个汇总文档(例如,包含数量的报告)/assets/recheck-inventory
是一个命令(即仅POST)另外,我们希望坚持使用REST原则:
答案 0 :(得分:0)
我也不喜欢这些方法,但请注意,REST不会对如何设计URI结构施加约束,因此您可以做任何您认为正确的事情。显然,这些网络服务的开发人员认为这种方法是正确的。
我会用你的URI做类似的事情,因为我更喜欢扁平的URI。
/assets/items/${asset-id}
-> /assets/${asset-id}
/assets/owned
-> /assets/?owned
-> /assets/?owned=true
/assets/summary
-> /assets-summary
-> /assets/ + "Prefer: return=minimal"
您可以找到有关prefer header here的更多信息,但请注意,如果您希望它是辅助缓存密钥,则需要vary header注册。