我们正在讨论如何设计REST端点。它基本上归结为这个人为的例子。
说我们有:
/netflix/movie/1/actors <- returns actors A, B and C
/netflix/movie/2/actors <- returns actors A, D, and E
演员A是同一个演员。
现在要获得“更好”的演员传记(是的,判决书):
/netflix/movie/1/actors/A
/netflix/movie/2/actors/A
或:
/actors/A
分歧最终源于使用Ember.js,它期望某种层次结构-vs-希望没有多种方式来访问相同的数据(最终它真的会是少量的代码重复)。可以将Ember.js映射到使用/ actors / A,因此没有严格的技术限制,这实际上更像是一个哲学问题。
我环顾四周,在这类事情上找不到任何可靠的建议。
答案 0 :(得分:4)
我遇到了同样的问题并且为了简单和健全(每个根的一个类型),选择2(每个资源一个“规范”URI)。
否则,你什么时候停止?考虑:
/actors/
/actors/A
/actors/A/movies
/actors/A/movies/1
/actors/A/movies/1/actors
/actors/A/movies/1/actors/B
...
答案 1 :(得分:3)
从局外人的角度来看,我希望电影/ 1 /演员/ A能够返回特定于该电影的那个演员的信息,而我希望/ actors / A能够返回有关该演员的信息。
通过类比,我希望projects / 1 / tasks / 1 / comments能够返回特定于任务的评论 - 通过其URL的最高级别的关系。
我希望projects / 1 / comments返回与较低级别项目相关的注释,或汇总项目中的所有注释。
这个类比并不是特定于有问题的数据,但我认为它说明了网址层次结构导致对返回数据的某些期望。
答案 2 :(得分:3)
在这种情况下,我显然更喜欢/actors/A
。
我的理由是,/movie/1/actors
报告了一个列表。这个列表,即电影和演员之间的 1-n映射,并不是一个有更多节点的路径。 人们根本不希望在电影树中找到演员。
您可能有一天会实施/actors/A/movies
返回1&amp; 2,这会让你实现像/actors/A/movies/2
这样的网址 - 这里你得到递归:movie / actor / movie / actor。
我更喜欢每个对象一个网址,以及一个可以找到1-n映射的清晰点。