REST API - 将资源设计为主资源和子资源

时间:2013-12-10 02:47:15

标签: api rest api-design

我的域模型中有一个特定的案例,现在我很难以其他方式设计这种情况。

我的域名中有3个实体:订单,卖家和公司

公司就像一家小公司,属于另一家公司(更大),就像一个品牌。例如:Zappos是亚马逊的品牌。

卖方是一家可以在品牌门户/网站上销售产品的公司,例如:Market Place。

最后,Order可以属于一个品牌(例如:亚马逊或Zappos),也可以属于卖家。

我认为Order实体是我API的主要资源:

GET order?status=NEW
GET order/{id}

问题是:如何设计我的API,例如,检索品牌或卖家的所有已打开的订单?

我不能以这种方式创建(下面),因为我将有两个名为“order”的子资源,其中包含两个不同的主要资源:

GET seller/{id}/order?status=NEW
GET company/{id}/order?status=NEW

如果我以这种方式创建(下方)我无法检索卖家或公司的订单过滤:

GET order?status=NEW

这种方法的另一个问题是,因为订单总是属于资源(公司或卖方)所以这个资源作为主要资源单独存在似乎很奇怪。

什么是解决这个问题的最佳方法?

1 个答案:

答案 0 :(得分:1)

考虑以关系方式分离您的数据,以便您可以:

GET /orders
GET /sellers
GET /companies

并且:

GET /orders/{id}
GET /sellers/{id}
GET /companies/{id}

每个都将返回您定义的默认行数,默认排序顺序,或者如果指定了id,则返回该特定行。

当您需要构建关系查询时,您可以执行以下操作:

GET /orders/?status=new&brand=zappos
GET /sellers/?status=new&company=amazon
GET /sellers/?status=closed&company=amazon&limit=10

或者,如果您需要更高级的关系查询,可以设计后端来处理简单查询:

urlencode this:status==new,date_created>1386652468

GET /orders/?ql=status%3D%3Dnew%2Cdate_created%3E1386652468

不知道你的约束,我不一定推荐这是最佳/唯一的方法,但是像这样分离数据是API的最佳实践。您可以根据登录的人员控制哪些品牌可见。如果您需要某人管理多个品牌,会发生什么?