我不完全了解如何在后端使用REST API进行复杂查询,以及在前端使用骨干网络应用程序。假设我有一个与user
表有关系的user_group
表:
user.group_ref => user_group.id
如果我在GET
上执行/api/v1/user/1/?format=json
,它会执行SELECT * FROM users WHERE id = 1
之类的操作。好的,好的,现在......如果我希望JOIN
user_group
user.group_ref = user_group.id
user_group
可以立即访问{{1}}上的数据。我不想做额外的查询去获取那些数据。
也许我把整个想法弄错了......有更简单的方法吗?
答案 0 :(得分:1)
REST是一组约定。它不提供自动查询映射,因此您需要定义服务端点,然后实现它以返回您想要的任何内容。
在您的情况下,组成URL的典型方式如下:
GET /groups/(groupid)/users
也就是说“给我属于这个群组的所有用户”。可替换地:
GET /users?group=(groupid)
哪种风格不那么“RESTful”,但不会不必要地将群组推广为顶级资源。
无论哪种方式,Backbone都不提供OOTB方式来填充来自更复杂资源的集合。对于除简单CRUD之外的任何事情,您必须自己实施服务调用,或者创建一个单独的只读集合,其url
映射到您的服务。类似的东西:
var UserGroupCollection = Backbone.Collection.extend({
url: function() { return "groups/" + this.options.groupId + "/users"; }
});
var group = new UserGroupCollection({groupId:1});
group.fetch();
答案 1 :(得分:0)
REST API可以单独实现,与前端没有任何关系,可以根据需要进行设计。
在您的情况下,如果您总是要获得带有用户查询的user_group.id,那么您应该永久地将SQL更改为JOIN语句:SELECT * FROM users WHERE id = 1 JOIN user_group WHERE user.group_ref = user_group.id。
如果您需要包含和不包含user_group信息的查询。您可以设计两个REST方法,例如(GET / api / v1 / user / 1?format = json)用于没有组信息,(GET / api / v1 / userwithgroup / 1?format = json)用于具有组信息的方法
在Backbone上,你可以有两个不同的模型来代表这两个。
如果表中没有数百万用户,那么带有组信息的SQL应该非常快,并且总是可以随身携带组信息。
答案 2 :(得分:0)
有一个名为slubmber(http://slumber.in/)的python库,它建立在REST API明确目的的请求之上。