【问题标题】:Design RESTful service with multiple ids设计具有多个 id 的 RESTful 服务
【发布时间】:2012-07-03 02:54:40
【问题描述】:

我正在设计一个 RESTful 服务。就是列出一组数据。主要问题是该集合没有合理的单一标识符。在系统的知识范围内也不能容易地计算出特定的集合。因此,似乎不可能有 GET /items/{identifier} 服务。

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

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

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

【问题讨论】:

  • 您关心什么 RESTful 约束? URI 只是遵循 RFC 3986 中规定的规则的标识符。我个人认为使用逗号分隔的值列表作为 URI 标识符的一部分没有问题。

标签: rest


【解决方案1】:

问题中所述的方法实际上意味着对于ids 的每个组合都有一个资源。假设我们有 2 个ids: 1 和 2。

/items/1,2

/items/2,1

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

对此进行建模的另一种方法是通过查询参数作为过滤语义。 假设id 实际上是资源的一个字段。

例如,通过id 1 获取item

GET
/items/1

Response:

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

所以问题是,如果我需要批量购买几件商品怎么办? 您可以将此问题概括为按某些字段上的值过滤items 的一般问题。 例如:获取所有类型为 table

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,其中id12。 假设我们将 or 操作建模为 ||,语法为 query

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多