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

时间:2015-01-26 21:30:31

标签: rest merge

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

场合

  • Endpoint公开单个资源,Ids是唯一的。
  • 名称是唯一的,但可以更改。
  • 外部应用程序可以存储对资源ID的引用。

问题

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

解决方案

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

  1. Mark' xyz' (被逐步淘汰的资源)与“abc”的副本相同。 (保留资源)。
  2. 更新' abc'合并资源应该是什么样的。
  3. 任何GET要检索' xyz'将导致302重定向到' abc'
  4. 问题

    怎么会这样做呢?我想做类似的事情:

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

    保留资源id1 =,资源id2 =。或者,如果它更有意义,反之亦然。

    然而,我担心的是合并行为会更新PUT上的两种资源。这是否违反了规则并且有更好的规定方法吗?

2 个答案:

答案 0 :(得分:3)

在我看来,RESTful范例非常适合为人们提供有关API可能行为方式的指导,但是将所有内容强加到其中并不会带来更好的开发人员体验。

我更愿意看到记录良好的POST动作,超出标准的四个动词。这是我的投票:

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

如果这种情况很常见,这也让您可以自由支持多ID版本。

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

答案 1 :(得分:1)

“合并”资源怎么样?

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"
}

对主要资源的请求将返回它,对任何辅助(合并)资源的请求将返回带有301主要资源标头的Location