1

我正在设计一个灵活的 Web 服务来聚合数据。

如果我们以销售为例。销售资源具有以下属性:

  • 销售人员
  • 产品
  • 价格
  • 顾客
  • ID
  • 部门
  • 日期
  • 等等

因此,访问销售的基本 URI 将类似于以下内容:

api/sales/{id}

我需要设计 URI 以满足以下要求:

  1. 一个部门的总销售额
  2. 一个人的产品总销售额

所以,三个基本要求。结果的分组、过滤和选择(类似于 GROUP BY、WHERE 和 SELECT)。

如何设计URI?对我来说真正的问题是如何设计分组。以下是我一直在考虑的一些想法:

  1. 保留当前的 ​​URI 设计,但添加其他参数:

    例如

    /api/sales?groupby=department&groupby=customer
    
  2. 新的 URI:

    /api/sales-aggregator?groupby=department&groupby=customer
    
  3. 包括分组作为路径的一部分:

    /api/sales-aggregator/department/customer
    

    但是部门和客户的顺序是任意的。

  4. 替代路径解决方案

    /api/sales-aggregator;groupby=部门,groupby=客户

建议?

4

1 回答 1

0

我会使用 3 或 4 并进行一些修改。

GROUP BY 语句与聚合函数一起使用,以按一列或多列对结果集进行分组。

SQL GROUP BY 语法

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

如果你需要一些通用的东西,那么会有很多不同的解决方案,那么使用这个aggregator词是可以的。如果您想将它与 GET 一起使用,那么我认为aggregation会是一个更好的词。使用 POST 可以使用aggregator.

如果链接不必满足一般用途,那么您应该将其重命名aggregation为特定的名称,它描述了聚合函数或查询的结果(如果您使用多个聚合函数)。例如GET /api/sales-person:123/sales-countGET /api/sales-count?sales-person=123

在单个响应中返回聚合函数使用的聚合和项目的另一个选项。

GET /api/sales/?sales-person=123 -> 200 ok
{
    count: 123,
    total: {
        value: 1234567,
        currency: "USD"
    },
    sales: [
        {
            id: 1,
            price: {value: 34556, currency: "USD"},
            ...
            links: {self: {href: "/api/sales/1"}}
        },
        ...
    ]
}

如果要在表示中启用/禁用聚合、项目属性等,可以将其与首选项标题一起使用。(如果你使用这个,不要忘记在变量头中添加偏好,否则缓存控制将无法正常工作。)

于 2015-11-30T12:46:02.700 回答