我正在使用ember-data构建一个EmberJS应用程序。
我的应用中的某些功能需要非常复杂的查询。
举个例子,假设我有三个实体 - 学生,老师和班级。如果我想得到1993年之前出生的所有在X老师上课的学生的名单,我怎么能用RESTful api做到这一点?在简单的SQL中,它很容易,但我不确定在我的API中实现它的最佳实践。
我是否需要与基本的REST API一起构建自定义端点?
所以我还有:
GET /students (which returns all the students)
GET /students/{id} (which returns a specific student)
etc
但是为我的'自定义'查询实现以下内容:
GET /students/custom/born_before/{date}/taught_by/{teacher_id}
或者有更标准化的方法吗?
答案 0 :(得分:29)
您可以转换
GET /students/custom/born_before/{date}/taught_by/{teacher_id}
到
GET /students/?born_before={date}&taught_by={teacher_id}
这只是一个"query by example"选项:您可以使用提供的字段填充模型实例并使用它们进行查询。字段越少,搜索范围越广,显示的结果越多。
这就是JIRA's API works的方式,例如。
答案 1 :(得分:8)
一种选择是在学生上设置一个可以发布的搜索终结点。
所以你可能有:
POST /students/filter
您发布POST的过滤器对象如下所示:
{ BornBefore:1993, TaughtBy:123 }
我还看到一个选项,而不是发布,API有一个过滤器,然后使用查询字符串。
我自己更喜欢第一个。特别是如果它可以是一个长时间运行的过程,因为您的POST可以返回一个ID和/或rel
链接到API调用,客户端应该使用它来获取状态更新并获得结果。
那么你就POST /Students/filter
了,它会以/Students/Filter/123
的rel回复,而你的客户会在GET
上定期/Students/Filter/123
,直到得到结果宾语。当然,对于简单的简短查询,您可以立即返回结果。但是,如果它需要一两秒钟,你可以走这条路。
This book by O'Reilly提供了有关构建ReSTful API的一些很好的信息。