当前位置: 首页 > 知识库问答 >
问题:

RESTful API路由设计:嵌套与非嵌套

呼延珂
2023-03-14

我的问题是关于在为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构建,泛型库需要知道一些额外的东西,比如“员工嵌套在部门下”,但“分支机构不嵌套在任何东西下”。如果所有的资源都可以用RESTFLILY方式处理,但以平面方式处理,那么知道如何处理它们就会更简单、更可预测。

    考虑一下,在数据库中,您不需要知道额外的信息就可以知道如何处理对象集合(例如RDMS中的表)。您总是将员工集合引用为employees,而不是departments/5/employees

  • 共有1个答案

    林炫明
    2023-03-14

    如果你想再往下钻几层,会发生什么呢?

    /API/地址?DepartmentId=1&EmployeeId=2&AddressId=3

    VS

    地址endpoint突然因为参数而变得臃肿。

    此外,如果您正在研究Richardson成熟度模型level 3,那么RESTful API应该是可以通过链接发现的。例如,在顶层,例如/api/version(/1),您会发现有一个指向部门的链接。下面是在HAL Browser这样的工具中的情况:

    "api:department-query": {
      "href": "http://apiname:port/api/departments?pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}"
    },
    "api:department-by-id": {
      "href": "http://apiname:port/api/departments?departmentId={departmentId}"
    }
    

    (可以是一个最终以分页方式列出所有部门的查询,也可以是一个直接指向特定部门的参数化链接,前提是您知道id)。

     类似资料:
    • 1. 前言 本小节我们介绍如何嵌套使用 VueRouter。嵌套路由在日常的开发中非常常见,如何定义和使用嵌套路由是本节的重点。同学们在学完本节课程之后需要自己多尝试配置路由。 2. 配置嵌套路由 实际项目中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件,例如: /article/vue /a

    • 在使用MongoDB的ExpressJS示例中,这是一个关于相关/嵌套资源的RESTful路由设计的一般设计问题。总之,我应该如何设计此类嵌套/链接管线? 关于我的应用程序/场景:我用NodeJS/ExpressJS和MongoDB实现了一个RESTful服务。我有两种不同的相关模型,分类和文章。 我找到了两种方法来设计关系船,分别是路线: 这意味着使用了嵌套路径,并且关系是直接的。 优点是设置文

    • 如果我将路由折叠起来,这样看起来就像: 工作很好。我嵌套的原因是因为我将在“dashboard”下有多个子项,并且希望它们都在URL中以为前缀。

    • 假设我希望RESTendpoint大致如下: 每个if上的CRUD都有意义。例如,/projects POST创建一个新项目,GET获取所有项目/projects/project_id GET仅获取该一个项目。 项目是特定于项目的,所以我将它们放在project_id下,这是一个特定的项目。 有没有办法创建这种嵌套路由? 现在我有这样的东西: 但是我正在寻找一种方法将项目路线嵌套到项目路线中,并能

    • 我在想这样的事情: 前台有一个不同的布局和风格与管理区域。所以在frontpage中的路由是home、about等等,其中一个应该是子路由。 /home应该呈现到Frontpage组件中,而/admin/home应该呈现在后端组件中。 最终解决方案: 这是我现在使用的最终解决方案。这个例子也像传统的404页面一样有一个全局错误组件。

    • 问题内容: 假设我想要具有大致如下所示的REST端点: 如果可行,对每个对象都使用CRUD。例如,/ user POST创建一个新用户,GET获取所有用户。/ user / user_id GET仅获取该用户。 项目是特定于用户的,因此我将它们放在特定用户 user_id 下。 现在,为了使Express Routing模块化,我制作了一些路由器实例。有一个供用户使用的路由器,以及一个用于物品的路