1

让你有一个这样的网址:

POST /departments,这将创建一个新部门
,并且POST /employees,这将创建一个新员工。

两个 url 都返回新创建资源的位置标头等。

假设一个员工可以属于多个部门。

您将如何构建相应的 URL,最重要的是您将使用 POST 或 PUT 来执行此操作?例如:要将比尔添加到图书部门,您会使用:

POST /departments/Books/employees/Bill

或者:

PUT /departments/Books
{
  "employee" : "Bill"
}

前者在我看来在语义上更正确,因为无论如何在POST正文中我有更多的数据来表征这种新关系。而且

GET /employee/Bill返回一个与以下返回的主体不同的主体:
GET /departments/Books/employees/Bill

所以对我来说,添加关系就像创建一个新资源。但是,我不喜欢在
POST /departments/Books/employees/BillURL 中明确命名新资源的事实。

4

3 回答 3

1

假设您事先知道员工的姓名,似乎最简单的方法是使用 PUT

PUT /departments/books/employees/bill

如果资源“Bill”是全新的,则返回 201。如果“Bill”已经存在,则返回 200。

GET /departments/books/employees/bill

GET /dapartments/giftcards/employees/bill

GET /employees/bill

应该返回相同的数据。我不确定如果“Bill”在两种情况下都是相同的资源,为什么它不会。

于 2013-11-07T09:40:13.467 回答
0

你的 URI 是什么样的并不重要,基于 REST 的系统不在乎。

GET {someUrlToDept}
=>
200 OK
Content-Type: application/hal+xml

<resource>
    <DepartmentName>Books</DepartmentName>
    <links>
        <link rel="http://myapi.com/rels/employees" href="{someUrlToEmployeesForThisDept}"/>
    </links>
<resource>

POST {someUrlToEmployeesForThisDept}
Content-Type : application/hal+xml

<resource>
    <EmployeeName>Bill</EmployeeName>
    <OtherStuff>...</OtherStuff>
</resource>
于 2013-11-07T12:52:51.733 回答
0

您的问题没有唯一的答案。当您有一个包含“A/B”的 URI 时,A 和 B 之间的关系留给开发人员 (AFAIK)。

但是,我认为 URI 应该遵循最小意外的原则,因此具有有限的含义。

对我来说,A/B只能代表三种可能的关系:

  1. “B 是概念 A 的一个实例”;
  2. “B是一个概念,它是实例A的一部分”;
  3. “A是概念,B是概念,B是A的一种”。

您的问题是关于案例 2 的使用。我更喜欢案例 2 仅用于“是”关系的一部分。

如果我应用此逻辑来回答您的问题,员工是否属于特定部门?

当然不是,因为您写道,一名员工可以为多个部门工作。“员工”和“部门”之间的关系是一种“为之工作”的关系,它是一种关联,而不是一种组合。因此,我不提倡使用:

/departments/Books/employees/Bill

我认为里面有一个明确的链接:

/departments/Books

资源,指向:

/employees/Bill

从长远来看,资源可能更清晰,更不容易被误解。

于 2013-11-07T13:29:05.267 回答