2012-07-03 64 views
3

我正在设计一个REST风格的服务。它列出一组数据。主要问题是该集合没有合理的单一标识符。在系统的知识范围内,也不能轻易计算出特定的集合。因此,似乎无法获得GET/items/{identifier}服务。使用多个ID设计REST风格的服务

我确实有要求的每个元素的ID。我的主要问题是,在URI中列出id不是RESTful(例如GET items/{id1},{id2},...,{idn})。对?

我可以看到DELETE具有类似的用例 - 在一个请求周期中删除多个项目。

在REST领域内如何满足这样的用例?那可能吗?

+1

语法什么的RESTful约束你关心的操作||模型? URI只是遵循RFC 3986中规定的规则的标识符。就我个人而言,使用逗号分隔值列表作为URI标识符的一部分看起来没有问题。 –

回答

0

问题中提到的方法实际上意味着对于ids的每个组合都有一个资源。比方说,我们有2 ids:1和2

/items/1,2 

/items/2,1 

上述代表不同的资源,虽然结果是一样的。 这可能会让API的使用者感到困惑。

模型化的另一种方法是通过查询参数作为过滤语义。 我们假设,id实际上是资源的一个字段。

例如,获取item通过id 1:

GET 
/items/1 

Response: 

{ 
    "id": 1, 
    "type": "table", 
    "color": "black", 
    ... 
} 

所以现在的问题是,如果我有什么需要得到几个项目作为散装? 您可以将此问题概括为根据某些字段上的值过滤items的常见问题。 例如: - 让所有类型

GET 
/items?query="name='table'" 

Response: 
{ 
    "data": [ 
     { 
      "id": 1, 
      "type": "table", 
      "color": "black", 
      ... 
     }, 
     { 
      "id": 2, 
      "type": "table", 
      "color": "grey", 
      ... 
     }, 
     { 
      "id": 6, 
      "type": "table", 
      "color": "brown", 
      ... 
     } 
    ] 
} 

items所以同样的问题可以问得到items其中id12。 比方说,我们在query

GET 
/items?query="id=1||id=2" 

Response: 
{ 
    "data": [ 
     { 
      "id": 1, 
      "type": "table", 
      "color": "black", 
      ... 
     }, 
     { 
      "id": 2, 
      "type": "table", 
      "color": "grey", 
      ... 
     } 
    ] 
}