rest - 是否使用子资源?

标签 rest asp.net-web-api asp.net-web-api2 restful-url restful-architecture

让我们以下面的例子为例:

我们希望通过 RESTful API 公开公司和员工信息。

公司数据应该非常简单:

GET api/v1/companies
GET api/v1/companies/{id}

员工属于公司,但我们仍然希望单独检索它们,因此哪种解决方案最好:

解决方案1:使用子资源

获取公司的所有员工:
GET api/v1/companies/{companyId}/employees

获取特定员工:
GET api/v1/companies/{companyId}/employees/{employeeId}

解决方案2:使用独立资源

获取公司的所有员工:
GET api/v1/employees?companyId={companyId}

获取特定员工:
GET api/v1/employees/{employeeId}

这两种选择似乎各有利弊。
  • 对于子资源,当我想要检索单个员工时,我可能并不总是手头有 CompanyId。
  • 有了独立的资源,如果我们想成为 RESTful,让公司的所有员工都应该使用子资源方法。

  • 否则,我们可以使用混合,但这缺乏一致性:

    获取公司的所有员工:
    GET api/v1/companies/{companyId}/employees
    

    获取特定员工:
    GET api/v1/employees/{employeeId}
    

    如果我们想忠于 RESTful 标准,在这种情况下采取的最佳方法是什么?

    最佳答案

    对我来说,这听起来像是 RESTful 服务常见的多对多关系问题。 (见 How to handle many-to-many relationships in a RESTful API?)

    您的第一个解决方案起初看起来不错,但是每当您想访问关系本身时都会遇到问题。

    您应该返回关系,而不是使用以下 GET 请求返回员工。

    GET api/v1/companies/{companyId}/employees/{employeeId}



    如果可以通过 2 个键识别该关系,则此解决方案似乎没问题。但是,如果该关系由 3 个以上的 id 标识,会发生什么? URI 变得相当长。

    GET api/v1/companies/{companyId}/employees/{employeeId}/categories/{categoryId}



    在这种情况下,我会为关系提出一个单独的资源:

    GET api/v1/company-employees/{id}



    返回的 JSON 模型如下所示:
    {
       "id": 1 <- the id of the relation
       "company": {
          "id": 2
       },
       "employee": {
          "id": 3
       },
       "category": {
          "id": 4
       }
    }
    

    关于rest - 是否使用子资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26795740/

    相关文章:

    java - 是否可以调用服务而不将其包装在转换中?有人用Java成功实现过吗?

    c# - 在具有大量流量的异步 ASP.NET Web API 中,将 ConfigureAwait 设置为 false 会产生什么影响?

    c# - Swagger/Swashbuckle 不适用于 Visual Studio 2013 Web API 2 项目

    c# - 从 WebAPI 2 端点返回自定义 HTTP 状态代码

    c# - Web Api 2 - 如何在不保存到磁盘的情况下从 HTTPGET 返回图像(来自 Azure 存储的 MemoryStream)?

    javascript - 使用 AngularJs 显示多个表中的数据

    json - 如何从 Yahoo Finance API 获取 10 个以上的搜索结果?

    java - 如何将不同的对象表示反序列化为 POJO?

    node.js - 如何在 Node JS rest API 中使参数可选

    asp.net - 通过 API 端点搜索时不使用 POST 的原因?