如何定义哪个资源是顶级 Rest 资源(URI 不嵌套在任何父级中)?
我的问题来自这样一个事实:如果我从字面上理解资源层次结构的概念,我最终会得到非常长的 URI,例如 5 或 6 层深。
这违背了 REST 简单性原则,而且链上的所有 id 都是唯一的,因此可以简化/缩短。此外,像 twitter 或 facebook 这样的大型 REST api,并不严格遵循层次结构规则。
最佳答案
REST 中没有层级规则。
事实上恰恰相反:URI 是不透明的,这是 REST 的原则,因此 URI <http://example.net/careers/technical/it/computing/programming/webProgramming/asp.net>
从 REST 角度来看,所传达的信息不比 <http://example.net/fasd12>
更多。 .
请注意,从 REST 角度来看,这两个 URI 都是不透明的。给定的过程(数字或人类思想)可能会以特定的方式解释前者,但除非服务器另有说明,否则该解释不会正确(仅通过查看 URI 无法知道它们都标识一个网络)帮助预测一群山羊产奶量的服务。
层次结构的用处是:
- 如果服务器已告诉客户端如何构建 URI(例如,要在客户端上执行的 html 表单、JavaScript 或描述如何构建 URI 的其他格式)。
- 如果服务器使用相对 URI 来描述链接,作为 HATEOAS 原则的一部分。
特别是在后者中,层次结构非常有用。
在这种情况下,如果您要对一组相互之间具有 5、6 或 14 级深度的层次结构关系的资源建模,则具有 5、6 或 14 级深度的 URI 会很有用。否则不会。
在这种情况下,它并不违反任何简单性原则:
-
..
作为相对URI引用非常简单,无论是从1级深度到0级,还是从43级深度到42级。 -
./programming/
作为相对URI引用非常简单,无论是从0级深到1级,还是从42级深到43级。 - 在给定上下文(例如相对引用所使用的上下文)之外,所有 URI 都同样不透明,因此也同样简单:它们都是可以比较彼此是否相等的字符串,仅此而已。
编辑:
相反,虽然没有理由害怕深厚的等级制度,但也没有理由对它们负有责任。如果 /a/b/c
的资源对您更有用作为复合资源包含在 /d
那么好吧。也可以两者兼得,使用 /a/b/c/d
和/e
两者都标识相同的资源(一个 301 到另一个将导致更好的缓存行为并使关系明确)。
关于RESTful 资源层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142158/