restful搜索与帐户关联的记录



我的API有两个记录:Car和Account。一个Account可以有多个关联的Car记录。

我有REST路由更新,删除,创建一个汽车记录。

通常情况下,调用所有汽车的GET路由看起来像这样:/car

特定汽车的路线将是/car/:id,:id来自该汽车。

我如何通过帐户ID设置REST路由来获取呼叫车?我是否需要做一些像account/:id/car这样的事情?

您可以使用URI路径分层或使用querystring。我认为URI RFC涵盖了这一点。

/cars?account=123
/accounts/123/cars

在REST中,您可以返回带有上部的超链接,例如

{
"operation": "ListCarsAssociatedWithAccount(accountId)",
"method": "POST",
"URI": "/accounts/{accountId}/cars",
"params": {"accountId": {"type":"AccountId"}}
}

REST客户端应该只知道如何调用ListCarsAssociatedWithAccount(accountId), URI和主体模板可以用参数填充。

使用这种方法,你甚至可以描述POST请求的主体和预期的响应,如果你想的话,并进一步自动化它:

{
"operation": "ListCarsAssociatedWithAccount(accountId, x)",
"params": {
"accountId": {"type": "AccountId"},
"x": {"type": "Number"}
},
"method": "POST",
"URI": "/accounts/{accountId}/cars",
"body": {
"q": {
"w": {"param": "x"}
}
},
"returns": {
"type":"CarList",
}
}

ListCarsAssociatedWithAccount(123, 5)
->
POST "/accounts/123/cars"
{
"q": {
"w": 5
}
}
200 OK
{
operations: [...],
values: [
{"carId": 34, operations: [...]},
{"carId": 3, ...},
{"carId": 4, ...},
...
]
}
->
var cl = new CarList();
cl.support(o.operations);
var item1 = new Car("carId": o.values[0].carId);
item1.support(o.values[0].operations);
cl.add(item1)
...
return cl;

在Hydra框架中使用了类似的(但要复杂得多)。http://www.hydra-cg.com/

端点被认为是灵活且易于添加(并在保持向后兼容性的同时进行修改)的。但通常是这样的:

GET/UPDATE/DELETE:  accounts/:id/cars/:carid
GET(search)/CREATE: accounts/:id/cars/

,你也可以从

得到相同的信息
GET/UPDATE/DELETE:   cars/:carid
GET(search)/CREATE:  cars/

注意,在后端,您应该为两个端点使用相同的逻辑(在端点之间重用代码)。第一组端点的思想是,您可以以逻辑/分层的方式钻取特定的元素。因此,如果您需要特定帐户的cars的子元素:

GET/UPDATE/DELETE:  accounts/:id/cars/:carid/wheels

允许最大限度地使用/重用数据,而无需在各个端点中不断添加基于account/car的过滤器。

注意:通常端点将被复数化,以便您可以从同一端点进行搜索,因此' GET/accounts'可以包含搜索参数以收集结果集。