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

Best approach for updating a relation to another resource in a REST API

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

GET /item/13

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

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

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

  1. 通过在 JSON 正文

    中将新 linked 资源的 ID 设置为简单的 属性 来建立新关系
    PATCH /item/13
    {
      userId: 43
    }
    
  2. 通过让客户端传递 link 本身作为输入来建立新关系

    PATCH /item/13
    {
      _links: [
        rel: 'user',
        href: '/user/43'
      ]
    }
    

我通常认为 links 是从 GET 调用返回的以其他格式存储的关系的只读表示(例如 id:s 到其他资源)。我觉得 links 作为 input 到 POST/PUT/PATCH 调用并不自然,而且 links 是一个数组让它变得更奇怪(你应该能够更新所有 links 吗?一个单一的 link?),但我在各种文章中看到它建议。有最佳实践吗?使用 link 方法有什么好处?

REST 的要点是(至少其中之一)是通过标准界面使一切可见。换句话说,如果 'relations' 是一个东西,那么它也应该有自己的资源。

API 也应该更具描述性。这可能是主观的,我不知道你 model/design 的所有细节,但 'items' 没有 'links'。 'Items' 可能只有一个 'owner'。如果是这种情况,它可能类似于:

GET /item/123/owner

因此发布或放置 URL 用户(或一些简单的表示)将 'change' 项目的所有者。可能不允许删除所有者,具体取决于模型是否允许无主项目。

请注意,在这种情况下,“/item/123”下的表示必须 link 到“/item/123/owner”,因为客户端仅遵循 link它从服务器获取。

所以,想想什么是重要的 'things',所有这些都应该有一个资源。另外,尝试添加尽可能多的 'meaning'/语义。关系应该 而不是 被称为 'user',它应该被称为 'owner'(或者你的模型中应该有的任何含义)。