【发布时间】:2013-02-27 22:09:59
【问题描述】:
我很难从概念上理解有关版本化资源 URL 的正确内容。
假设我有一个应用程序,它以与版本控制系统非常相似的方式跟踪食谱,例如 RCS 之类的老派。每个版本都可以是一段时间的工作副本,然后从中创建一个新版本。每个版本都有与之关联的 cmets,并且不共享 cmets。我可以随时回顾历史并查看配方的演变过程,但每个实例始终被视为同一配方的一个版本。我试图找出最合适的方式来构建引用这些 URL 的 URL,但我无法理解子资源和时间资源等之间的一些差异。
我见过的两种主要方式是:
> 1) query parameters
> -- /recipes/ultimate-thing -> List of available versions of Ultimate Thing
> -- /recipes/ultimate-thing?version=2 -> Version 2 of Ultimate Thing
> -- /recipes/ultimate-thing?version=latest -> Current working version of Ultimate Thing
2a) Nested resources with versions considered subresources
-- /recipes/ultimate-thing/versions/ -> List of available versions of Ultimate Thing
-- /recipes/ultimate-thing/versions/2 -> Version 2 of Ultimate Thing
-- /recipes/ultimate-thing -> Current working version of Ultimate Thing
2b) Nested resources with the list at the resource
-- /recipes/ultimate-thing -> List of available versions of Ultimate Thing
-- /recipes/ultimate-thing/versions/2 -> Version 2 of Ultimate Thing
-- /recipes/ultimate-thing/versions/latest -> Current working version of Ultimate Thing
我觉得每次我试图说服自己采用一种方法时,我都觉得我缺乏理解来为该方法构建适当的理由。
1 似乎是很多 Rails 人的首选,但我不确定如何明确何时要创建新版本的配方,因为 POST 到特定资源 (/ recipes/ultimate-thing) 通常想要创建具有该名称的资源,如果它不存在,是否适合返回类似 404 的内容而不是创建它并且只发布到 /recipes 创建新食谱,然后允许 POST 到 /recipes/ultimate-thing 创建新版本?另外,如何表示 cmets?如果没有版本,我可以执行类似 /recipes/ultimate-thing/cmets 之类的操作,但 /recipes/utlimate-thing/cmets?version=latest 看起来很难看,而 2b 看起来确实如此更明确的“终极事物配方的最新版本的评论”,2a 似乎最干净。
事实上,我通常最喜欢 2a,但我无法确定版本是食谱的子资源,因为没有食谱,版本 是食谱,但该食谱的所有版本应该在逻辑上组合在一起。
我还在 stackoverflow 上看到了 2b,但它似乎过于冗长,因为您一直都需要像 /recipes/ultimate-thing/version/latest/cmets 这样的东西。尽管如果我将版本视为带有可注释说明的成分集合,而将配方视为具有相似意图的版本集合,那么这确实是最有意义的。
我真的很喜欢 2a,但是我所缺少的方法是否有一些东西使它成为一个坏主意?我是否遗漏了 1 如何工作的东西,这使得它似乎受到很多人的青睐更有意义?
或者总是做像 /recipes/ultimate-thing/latest 或 /recipes/ultimate-thing/2/cmets 这样的事情会更有意义吗?这是否最不明确地表明这些是同一配方的不同修订?
我不确定这是否是一个非常合适的论坛,我只是想讨论一下,这样我就明白为什么一种方法会比另一种更好。
【问题讨论】:
-
微软提供 API 版本控制官方指南:github.com/Microsoft/api-guidelines/blob/master/…
-
@ChrisMarisic 不幸的是不相关。我没有对我的 API 进行版本控制,我提供了一个 API 来访问已版本控制的资源。 API和模型在版本之间是相同的,但资源的内容会发生变化。从某种意义上说,它完全是一种不同的资源,但从逻辑上讲,它们都是原始资源的顺序变化而相关的。
标签: rest restful-url restful-architecture