我在概念上很难理解有关版本化资源的 URL 的正确内容。
假设我有一个应用程序,它以非常类似于版本控制系统的方式跟踪食谱,比如像 RCS 之类的老派。每个版本都可以是一段时间的工作副本,然后从中创建一个新版本。每个版本都有与之关联的评论,并且不共享评论。我可以随时回顾历史并查看配方的演变过程,但每个实例始终被视为同一配方的一个版本。我试图找出构建 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 -创建新版本的东西?另外,如何表示评论?如果没有版本,我可以做类似/recipes/ultimate-thing/comments 的事情,但是/recipes/utlimate-thing/comments?version=latest看起来很丑,而 2b 确实看起来更明确“最新版本的终极事物配方的评论”,2a 似乎最干净。
事实上,我通常最喜欢 2a,但我很难确定版本是食谱的子资源,因为没有食谱,一个版本是食谱,但该食谱的所有版本都应该在逻辑上组合在一起。
我还在 stackoverflow 上看到了 2b,但它似乎过于冗长,因为您一直需要/recipes/ultimate-thing/version/latest/comments之类的东西。虽然如果我认为一个版本是一组带有可以注释的说明的成分,而一个食谱是一个具有相似意图的版本的集合,那么这确实是最有意义的。
我真的很喜欢 2a,但是我所缺少的方法是否有一些东西使它成为一个坏主意?我是否遗漏了 1 如何工作的东西,这使得很多人似乎更喜欢它?
或者总是做类似/recipes/ultimate-thing/latest或/recipes/ultimate-thing/2/comments 之类的事情是否更有意义,即使这使得这些是同一食谱的不同修订版最不明确?
我不确定这是否是一个非常合适的论坛,我只是想讨论一下,所以我明白为什么一种方法会比另一种更好。