我的问题是在构建API URL时,嵌套资源的优势。考虑以下两种访问员工资源的替代方案:
/api/employees?department=1 # flat
Vs.
/api/departments/1/employees # nested
现在考虑开发一个通用库,用于访问 API 中的 REST 资源。如果所有路由都是扁平化的,这样的 REST 封装库只需要知道所访问资源的名称:
store.query('employees', {department_id:1}) => /api/employees?department=1
然而,如果我们要支持嵌套路由,这个包装器就需要知道额外的信息,例如哪些模型是嵌套的以及它们属于哪个其他资源,以便知道如何构建引用此类模型的URL。鉴于并非所有模型都会嵌套在同一个父资源下,甚至有些模型根本不会嵌套,因此REST包装库需要具有描述所有这些额外知识的配置,否则就不需要这些知识。所以我的问题是:
在API中使用嵌套资源路由有什么真正的优势?(它并不适用于最终用户,并且从拥有更漂亮的URL中获得的好处更少)。
嵌套方法是否真的比平面结构更好,除了美学之外,是否值得引入支持资源URL构建的不一致所带来的额外工作和复杂性?
/employees/5
或/departments/1
这样的URL来寻址单个资源。我不认为那是嵌套的。当我说嵌套资源时,我指的是像
/departments/1/employees
这样的URL,其中一个资源始终在另一个资源的上下文中被寻址。主要问题在于事实上,对于URL构建,通用库需要知道额外的信息,例如“员工嵌套在部门下”,但“分支不嵌套在任何东西下”。如果所有资源都可以以RESTful但是平面的方式来寻址,则更简单且更可预测地了解如何寻址它们。当您考虑它时,在数据库中,您无需了解额外信息即可知道如何寻址一组对象(例如关系数据库管理系统中的表)。您总是将员工集合称为
employees
,而不是departments/5/employees
。
/employees/{uid}
这样的URL的澄清。我不关心那些,因为它们不属于嵌套资源的定义范畴。 - Ernesto/api/companies/123/users/456
这样的URI并不一定说明用户是公司的子资源。你可以设计你的系统来确切地做到这一点,但客户端不应该依赖这样的知识!相反,使用链接关系来提示客户端有关语义上下文的信息。 - Roman Vottner