更新REST API中另一个资源的关系的最佳方法

时间:2016-01-26 09:28:04

标签: rest hateoas http-patch

假设我有一个遵循基本HATEOAS原则的REST API。 Items属于User

GET /item/13

{ 
  id: 13,
  name: 'someItem',
  type: 'someType',

  _links: [
    {
      rel: 'user',
      href: '/user/42'
    }
  ]        
}

现在我需要一种方法来更改给定项目的用户。使用PUT还是PATCH,这是执行修改的首选方式?

  1. 通过将新链接资源的ID设置为JSON正文中的简单属性来建立新关系

    PATCH /item/13
    {
      userId: 43
    }
    
  2. 通过让客户端将链接本身作为输入

    来建立新关系
    PATCH /item/13
    {
      _links: [
        rel: 'user',
        href: '/user/43'
      ]
    }
    
  3. 我通常认为链接是以GET调用返回的其他格式(例如id:s到其他资源)存储的关系的只读表示形式。将链接作为输入连接到POST / PUT / PATCH调用对我来说并不是很自然,而且链接是一个数组的事实使它更加奇怪(如果你能够更新的话)所有链接?一个链接?),但我已经在各种文章中看到它。有最好的做法吗?使用链接方法有什么好处?

1 个答案:

答案 0 :(得分:4)

REST的重点是(至少其中一个)是通过标准接口使所有内容可见。换句话说,如果'关系'是一件事,而不是它应该拥有自己的资源。

API也应该更具描述性。这可能是主观的,我不知道您的模型/设计的所有细节,但'项目'没有链接'。 '项目'可能会有一个“拥有者”#39;如果是这种情况,它可能看起来像:

GET /item/123/owner

因此,POSTing或PUTing用户的URL(或一些简单的表示)将会改变'该项目的所有者。可能不允许删除所有者,具体取决于模型是否允许无主项目。

注意," / item / 123"下的表示;在这种情况下,必须链接到" / item / 123 / owner",因为客户端只跟踪从服务器获取的链接。

所以,想一想什么是重要的东西,所有这些都应该有资源。此外,尽量添加尽可能多的含义' /语义。该关系应该被称为“用户”,它应该被称为“所有者”' (或模型中的任何含义)。