如何在创建odata API时处理复杂的关系?

时间:2016-09-03 05:42:38

标签: rest odata restful-architecture restful-url api-design

我正在为第三方产品构建Asp.Net Web API,并考虑将OData 4用于我的API。我的对象模型中有相当大的自由度,但无法更改基础数据模型。

我知道odata支持用于定义关系的导航属性,但它们似乎只是对象之间的直接链接。在数据模型的许多情况下,建立在关系上的我有自己的属性。例如,用户'有一个'会员的集合'与团体,组织单位等的关系,以及'会员链接本身有一个默认'布尔属性。在某些情况下,关系具有多个属性。

有没有最好的办法来解决这个问题?我是否需要成为'会员资格'具有属性的实体,并且具有导航属性的用户(用户>成员资格>组)有两个跃点?我应该做一个会员资格'复杂类型,创建会员资格'属于'会员资格'并在会员资格中拥有导航属性' (如果那可能)?为了方便起见,我还应该向所有组成员添加一个只读导航属性(用户>组)吗?

由于

1 个答案:

答案 0 :(得分:0)

从REST角度(参见Richardson Maturity Model level 3),一旦导航到user资源,客户端就可以发现group-query关系(链接)。以下是HAL Browser等工具的外观:

"api:group-query": {
  "href": "http://apiname:port/api/group?userId=1,pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}"
},

这会将消费者带到用户所属的group资源的(分页)集合中:

GET /api/user/1/groups

可以返回这样的内容:

{
    "groups": [
      {
        "id": 123,
        "name": "Test Group"
      }, 
      {
        "id": 134,
        "name": "Tennis squad"
      }
    ]
}

如果您整合链接,我认为不需要membership资源/实体。