RESTful多对多可能吗?

时间:2011-03-24 19:03:42

标签: rest

如何表示REST帖子的复杂资源?

您好, 目前我有一个应用程序,当用户点击“保存”时,它会遍历所有表单元素并创建一个管理a:

的大量对象
  var = params = [{ 
   attributes1: form1.getValues(),
   attributes2: form2.getValues(),  
.. ..
}];

然后我通过RPC POST将此批量对象发送到我的“实体”模型服务。 我希望保留数据的这个实体非常复杂。总而言之,数据分布在大约30个表格中。为了帮助解释我的实际问题,“实体”是一个建筑物(如物理/房屋/公寓)。

我想要的是能够将我的烂摊子变成用于保存属性的RESTful API。 我遇到的问题是,保存跨越单个表的单个模型的详细信息很好。当模型具有

时,如何构建用于传输的数据对象
  • 多对多关系
  • 一对多关系
  • 一对一的关系

例如:

以下是我对房产和示例数据

的可能性
propertyId: 1,
locationId: 231234,
propertyName: "Brentwood",
kitchenFeatures: [
             { featureId: 1, details: "Induction hob"},
             { featureId:23, details: "900W microwave"}
],
propertyThemes: [ 12,32,54,65 ]

这实际上还有很多......但是你可以得到一般的要点。 kitchenFeatures将是多对多的示例,其中我有一个featuresTable,它具有如下所有功能:

`featureId`, `feature`
1             "Oven Hob"  
23            "Microwave"

和propertyThemes将是另一个多对多的例子。

我希望如何形成我的RESTful服务的“对象”?这甚至可能吗?

即。如果我想保存此属性,我会将其发送到:

http://example.com/api/property/1

3 个答案:

答案 0 :(得分:10)

我在这里使用的方法是超媒体和链接:

/property
/property/{id}
/property/{id}/features/{id}

根据您的域名,您甚至可以逃脱:

/property/{id}/features/{name}

/property/{id}/features/byname/{name}

因此,您可以执行REST 操作并提供JSON或XHTML 超媒体

物业详情:

Request: GET /property/1
Response:
{
  ..
  "name": "Brentwood",
  "features": "/property/1/features"
  ..
}

布伦特伍德的特点:

GET /property/1/features
{
  ..
  "Kitchen": "/property/1/features/1",
  "Dog Room": "/property/1/features/dog%20room",
  ..
}

GET /property/1/features/1
{
  ..
  "Induction hob": "/property/1/features/1/1",
  "900W microwave": "/property/1/features/1/23",
  "nav-next" : "/property/1/features/dog%20room",
  ..
}

要添加关系,您可以执行以下操作:

POST /property/1/features
{
  ..
  "Name": "Oven Hob"
  ..
}

如果您知道关系是什么,请使用PUT:

PUT /property/1/features/23
{
  ..
  "Name": "Oven Hob"
  ..
}

您可以投放多种媒体类型:

GET http://host/property/1/features/dog%20room.json

GET http://host/property/1/features/dog%20room.xhtml

对于xhtml中的响应,响应可以使用如下命名链接:

..
 <a href="http://host/property/1/features/1" rel="prev">Kitchen</a>
..

您可以使用REST的其他方面,例如我上面没有包含的响应代码。

因此,为了建模关系,您可以使用链接,这些链接本身可以是可以使用GET,PUT,POST和DELETE操作的资源,甚至是自定义动词,例如ASSOCIATE或LINK。但前四个是人们习惯的。记住PUT是幂等但不是POST。见PUT vs POST in REST

编辑:您可以将链接分组到JSON数组中,为超媒体提供结构。

答案 1 :(得分:3)

我认为你真的在问,“我如何以适合在POST中传输的形式表示复杂数据?”,对吧?它与REST关系不大,而与您选择的媒体类型有关。我建议从纯JSON表示开始,使用数组和交叉引用的ID字段来映射关系。当然,您也可以使用XML执行此操作。

你给出的例子看起来对钱。您只需要确保双方(浏览器和服务器)就您使用的媒体类型的结构和解释达成一致。

答案 2 :(得分:2)

我正在处理完全相同的事情。我选择不在任何地方使用id,但是在任何地方都使用url通常会被期望。

因此,在您的情况下,kitchenfeatures可能只是一个带有URL的数组:

/feature/1
/feature/23

主题

/propertyTheme/12
/propertyTheme/32
etc..

在多对多关系的情况下,我们整体更新所有关系。通常我们只是转储现有数据,并插入新关系。

对于一对多关系,我们有时会在有意义的地方扩展网址。如果您对“属性”有评论功能,则可能看起来像

/property/1/comment/5

但这实际上取决于我们的情况,对于其他情况我们将它放在顶级命名空间中。

这对你有帮助吗?