如何使用REST API实现复杂查询?

时间:2013-05-28 15:34:36

标签: api rest ember-data

我正在使用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}

或者有更标准化的方法吗?

2 个答案:

答案 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的一些很好的信息。