深度对象路由的 Web API 最佳实践

Posted

技术标签:

【中文标题】深度对象路由的 Web API 最佳实践【英文标题】:Web API Best Practice for Deep Object Routes 【发布时间】:2015-09-23 15:16:13 【问题描述】:

在使用 ASP.NET Web API 设计 RESTful API 时,我可以创建多个路由来检索相同的数据。但我应该吗?它被认为是有用的还是令人困惑的?

例如,如果我有 Parent > Child > Item 的对象关系,我可能有三个路由返回相同的单个项目:

api/parents/:parent/children/:child/items/:item api/children/:child/items/:item api/items/:item

提供所有三个路线是否有用,还是应该限制为最简单的路线以避免混淆?在这方面有最佳实践吗?

【问题讨论】:

【参考方案1】:

选择要使用的 URI/路由是出于期望的目的,而不是内容。用户是否有可能在不考虑特定父母的情况下寻找孩子?如果是,则在单独的根 URI 中提供数据,如果不是,则通过要求用户提供 parentId 来限制对子数据的访问。

URI api/children 将返回所有孩子,而不管他们的父母是谁,因此与api/parents/:parentId/children 相比,它只返回 :parentId 实例实际引用的孩子。结果将始终包含也可以使用api/children 获得的数据,但它带有附加信息,因为这些子代“属于”指定的父代。

在我看来,您的所有选择都是有效的,因为它们都有不同的目的。但是,我会避免为同一目的使用不同的 URI。

【讨论】:

这很有意义。感谢您的想法。【参考方案2】:

如果用户有权访问最低级别的唯一标识符(在您的情况下为:item),那么他们应该调用

api/items/:item

关于父母的信息是多余的/不相关的。

我会去:

api/parents
api/parents/:parentid
api/parents/:parentid/children
api/children
api/children/:childid
api/children/:childid/items
api/items
api/items/:itemid

【讨论】:

以上是关于深度对象路由的 Web API 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

编写 Node.js Rest API 的 10 个最佳实践

使用 Laravel API 的最佳实践

深度 | API 设计最佳实践的思考

设计 Node.js REST API 的 10 条最佳实践

编写 Node.js RESTful API 的 10 个最佳实践

基于属性的路由 VS 基于约定的路由 - ASP.net Core RESTful API 的最佳实践 [关闭]