REST 合并资源 - PUT 上的多个更新

REST Merge Resources - Multiple updates on PUT

我不相信这个 post 完全回答了这个问题。

情况

问题

有时会创建重复的资源并最终被引用。

解决方案

公开允许资源的端点"merged"。这将执行以下操作:

  1. 将 'xyz'(被淘汰的资源)标记为 'abc'(被保留的资源)的副本。
  2. 将 'abc' 更新为合并资源的外观。
  3. 任何检索 'xyz' 的 GET 都会导致 302 重定向到 'abc'

问题

如何才能安心地做到这一点?我想做类似的事情:

PUT http://endpoint/resource/{id1}/merge/{id2}

{
    //new merged resource
}

其中 id1 = 被保留的资源和 id2 = 被保留的资源。或者,如果更有意义的话,反之亦然。

但是我担心的是合并行为会更新 PUT 上的两个资源。这是否违反了规则,是否有更好的规定方法来做到这一点?

在我看来,RESTful 范式非常适合为人们提供关于您的 API 可能行为方式的指南,但是强制您尽一切可能投入其中并不会带来更好的开发人员体验。

我更愿意看到除了标准的四个动词之外的所有内容都有详细记录的 POST 动作。这是我的投票:

POST http://endpoint/resources/{id1}/merge
  {
     "merge_id": {id2}
  }

这也让您可以自由地支持多 ID 版本,如果这很常见的话。

POST http://endpoint/resources/{id1}/merge
  {
    "merge_ids": [
      {id2}, {id3}, {id4}
    ]
  }

"merge" 资源怎么样?

POST http://endpoint/merges/
{
  "merge_ids": [
    11, 12, 13, 14
  ]
}

201 Created
Location: http://endpoint/merges/486C23F8-A5FD-11E4-A65F-14CD89BEA664

此资源将具有可查询的单独状态:

GET http://endpoint/merges/486C23F8-A5FD-11E4-A65F-14CD89BEA664

200 OK
{
  "merge_ids": [
    11, 12, 13, 14
  ],
  "state": "merged"
}

对主要资源的请求将 return 它,对任何辅助(合并)资源的请求将 return 301Location header 的主要资源。