14

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

还是有更标准化的方式来做到这一点?

4

2 回答 2

32

你可以改变你的

GET /students/custom/born_before/{date}/taught_by/{teacher_id}

进入

GET /students/?born_before={date}&taught_by={teacher_id}

这只是一个“通过示例查询”选项:您可以使用提供的字段填充模型实例并使用它们进行查询。字段越少,搜索范围越广,要显示的结果就越多。

例如,这是JIRA 的 API 的工作方式。

于 2013-05-28T15:42:40.337 回答
9

一种选择是在您的学生身上设置一个搜索端点,您可以发布到该端点。

所以你可能有:

POST /students/filter

您要发布的过滤器对象如下所示:

{ BornBefore:1993, TaughtBy:123 }

我还看到了一个选项,API 有一个过滤器,而不是发布它,然后使用查询字符串。

我自己更喜欢第一个。特别是如果它可能是一个长时间运行的过程,因为您的 POST 可能会返回一个 ID 和/或一个rel指向 API 调用的链接,客户端应该使用它来获取状态更新并获得结果。

所以你会POST /Students/filter,它会用 rel of 回应/Students/Filter/123,你的客户会做周期性GET的,/Students/Filter/123直到它得到结果对象。当然,对于简单、简短的查询,您可以立即返回结果。但如果它需要超过一两秒,你可以走这条路。

O'Reilly 的这本书有一些关于构建 ReSTful API 的很好的信息。

于 2013-05-28T15:43:37.167 回答