您好, 目前我有一个应用程序,当用户点击“保存”时,它会遍历所有表单元素并创建一个管理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
答案 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
但这实际上取决于我们的情况,对于其他情况我们将它放在顶级命名空间中。
这对你有帮助吗?