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

Ano*_*ous 14 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
Run Code Online (Sandbox Code Playgroud)

但是为我的"自定义"查询实现以下内容:

GET /students/custom/born_before/{date}/taught_by/{teacher_id}
Run Code Online (Sandbox Code Playgroud)

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

Pab*_*ano 31

你可以改变你的

GET /students/custom/born_before/{date}/taught_by/{teacher_id}
Run Code Online (Sandbox Code Playgroud)

GET /students/?born_before={date}&taught_by={teacher_id}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 结果可以缓存(与`POST`的解决方案相反). (3认同)

tay*_*onr 9

一种选择是在学生上设置一个可以发布的搜索终结点.

所以你可能有:

POST /students/filter
Run Code Online (Sandbox Code Playgroud)

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

{ BornBefore:1993, TaughtBy:123 }
Run Code Online (Sandbox Code Playgroud)

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

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

那么你就会用POST /Students/filter它来回复/Students/Filter/123,你的客户会定期GET开始/Students/Filter/123直到得到结果对象.当然,对于简单的简短查询,您可以立即返回结果.但是,如果它需要一两秒钟,你可以走这条路.

O'Reilly的这本书提供了有关构建ReSTful API的一些很好的信息.

  • 我不喜欢使用POST来"获取"信息,在我看来,这不是RESTful. (21认同)
  • 我更新了我的答案,以说明在某些情况下你为什么要发帖子.实质上,您正在POST一个服务器运行的搜索对象,然后稍后获取结果.就像您将图像POST到服务器并稍后检索它一样. (2认同)