如何在REST API列表中实现所选项?

时间:2014-05-24 10:41:45

标签: rest

我有一个标准的REST API项目列表,每个项目的URI都可以访问

GET /items/1

{"item":{
    "some":"data",
    "selected":false
}}

现在我想添加一个约束,只能选择列表中的一个项目。换句话说,如果选择了一个项目,则所选其他项目在所选字段中应为false。基本上它应该像一个单选按钮组。

我看到了如何实现它的三个选项,所有这些选项都不好

  1. 保持原样。如果有人更新了某个项目,则服务器会更改先前所选项目中的值。遗憾的是,这使资源无法缓存。我更新了一个项目,但另一个项目也改变了它的状态。
  2. 更改资源,以便整个列表是一个实体。客户端立即更新它,并由他来确保只选择一个项目。我不喜欢这个解决方案,因为这些项目在逻辑上是分开的实体,我想分别访问它们。
  3. 强制客户端首先取消选择之前选择的项目,然后才允许他选择新项目。对于客户来说这很复杂,如果有更多的客户试图选择一个项目,它会导致丑陋的竞争条件。
  4. 我有没有看到更好的解决方案?

1 个答案:

答案 0 :(得分:1)

  

这些项目在逻辑上是独立的实体,我想访问它们   分开。

虽然对于个别项目可能也是如此,但对于他们的选择却无法真正说出来。 正如您所描述的那样,选择实际上并不是单个资源的状态。这是整组物品的属性。

因此,我会通过向表示项目集合的资源发出POST请求来管理选择

POST /items?selection=<item_id>

我也不允许通过单个selected资源的任何请求修改item属性。

从项目的表示中删除selected属性并将选择作为单独的资源也许是一个好主意。

GET /items/1 - 阅读第一项

GET /items/selected - 阅读当前选定的

或者可能将选择作为整体items资源的属性。

{ 
  "items" : [
     {"id" : 1, "some" : "data"},
     {"id" : 2, "some" : "data"}
   ],
  "selected" : 2
}

或两者,无论哪种方式,我都不会在集合中的项目表示中保留与集合相关的数据。