我的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'可以包含搜索参数以收集结果集。