Rest API:在给出详细表示的情况下合理地创建关联资源?

时间:2013-05-23 16:02:11

标签: api rest api-design

认为我们有几个收集资源。

我可以在这个集合上创建一个实例资源:

POST /people
{
    "_links" : {
        "car" : {
            "href" : "/cars/66H8800"
        }
    }
    "name": "John"
}

但是,接受以下内容会非常合理吗?

POST /people
{
    "_links" : {
        "car" : {
            "license" : "66H8800"
        }
    }
    "name": "John"
}

...这会导致创建资源/people/1(例如),/cars/66G8800,如果/cars/66G8800尚未存在?

似乎我开始混淆POST(创建新资源)和PUT(更新/创建特定资源)的目的。

1 个答案:

答案 0 :(得分:1)

执行摘要:两者都没问题。我会跟#1一起警告你至少要做两次,可能是三次请求。一个是PUT车,另一个是POST车主/司机。如果您事先没有汽车的完整资源数据,请在PUT之前为此做一个GET,根据需要更新您的PUT请求体。如果GET返回404,那么只需将未知字段留在PUT中,并定义服务器将使用默认值填充它们(而不是拒绝PUT请求)。

答案很长:

REST并未规定您的邮件正文的格式应该是什么 REST引起的唯一限制是:

  1. 统一界面,在本例中是HTTP的POST方法。使用POST意味着您打算将请求主体定义的新资源附加到目标URI标识的集合。如果这样做,则要求服务器也必须在其他地方创建资源,那就这样吧。
  2. 记录在案的,最常见的媒体类型。使用现有媒体类型(例如application/hal+json)或记录您创建的媒体类型。
  3. 使用超媒体(即链接)推进应用程序状态(浏览器窗口)。在请求正文中,您可以发送任何您喜欢的内容。服务器负责在响应中提供汽车与人之间的超链接。
  4. 请求必须是自包含的。这意味着您不能发送一个请求“将当前汽车设置为66H8800”,然后再发出第二个请求“为当前设置的汽车创建驱动程序”。这样做需要在请求之间记住服务器状态,这在REST中是被禁止的(因为它破坏了很多东西,比如负载平衡)。看来你没有这样做,但我无法从提供的代码中看出来。
  5. 您的媒体类型决定了“许可”密钥是否应该存在。根据需要选择或创建一个。