具有其他资源的RESTful集合的正确路由模式

时间:2016-09-19 15:58:57

标签: rest collections routes hateoas

我一直在做RESTful API(暴露和消费第三方),我看到两个以下的模式在这里和那里出现。每个都有利有弊,而且#34;清洁"在我看来。

所以情况是:你有一个集合资源(例如" assets")并且你想在集合中暴露一些额外的资源(例如集合本身的子资源,而不是资产,比如聚合视图端点或一些命令)。

我看到的两种模式是:

  1. 人们创建一个RESTful集合资源,如/assets/${asset-id},并公开他们需要的所有其他内容,如GET /assets/ownedGET /assets/summaryPOST /assets/recheck-inventory。这看起来简洁明了,但引入了${asset-id}与子资源网址名词之间的冲突(例如asset12345summary位于网址中的相同位置。)

    < / LI>
  2. 其他人/assets/items/${asset-id}并公开GET /assets/ownedGET /assets/summary等所有内容。从路由角度来看这更清晰,更具有前瞻性,但在路线中添加了一个额外的名词,例如当人们试图POST /assets时会导致混淆。

  3. &#34;最佳实践&#34;到目前为止我经历的指导方针完全避免了这个问题。我也明白,REST是一种惯例,而不是标准,而且还有一种普遍的&#34;它取决于&#34;回答。不过,我觉得这里必须有一个通用的推荐。

    因此问题是:你会使用哪两个?

    更新:澄清一下,让我们假设:

    • /assets/owned包含不同类型的实体,而不是资产,因此它不是查询,您可以在其中获取/发布/删除项目。
    • /assets/summary是一个汇总文档(例如,包含数量的报告)
    • /assets/recheck-inventory是一个命令(即仅POST)

    另外,我们希望坚持使用REST原则:

    • 路径的路径应唯一地标识实体及其状态。
    • 查询参数会更改返回的元素,但不会更改有效内容格式。
    • 标题用于协议级信息,不会更改服务逻辑(即表示,安全性,缓存等)。

1 个答案:

答案 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注册。