8

如何为资源集合设计 REST url,按属性过滤资源不等于给定值?

例如,要让 8 年级的学生,我们使用

GET /students?grade=8

如果我们需要让学生不在8 年级,如何做同样的事情?以及如何设计小于(<),大于(>)等?

4

3 回答 3

8

我正在考虑做的是将运算符作为参数的一部分,与值分隔。我还将定义非符号运算符以避免需要丑陋的 URL 编码或与参数名称后的等号混淆。对于您的示例,对于非 8 年级的学生来说,这将是这样的:

GET /students?grade=neq|8

年级 > 8 的学生将是:

GET /students?grade=gt|8

8 至 10 年级(含)的学生:

GET /students?grade=gte|8,lte|10

这种方法可以扩展到其他可过滤的字段,而无需添加额外的参数来修改每个字段的过滤方式。

于 2013-03-13T11:51:59.997 回答
4

Stripe 拥有最受尊敬的 API 之一。

他们为每个用点分隔的运算符使用单独的参数。

例如,要搜索创建日期:

/charges?created.gt=
/charges?created.gte=
/charges?created.lt=
/charges?created.lte=

在您的情况下,您可以执行以下操作:

/students?grade.gt=8&grade.lt=8

甚至为 not 添加另一个运算符:

/students?grade.not=8
于 2020-12-11T19:56:27.747 回答
3

一种选择是添加一个额外的查询参数,例如在将值与参数gradeOperator进行比较时,您可以在其中传递要使用的运算符。grade例如,

GET /students?grade=8&gradeOperator=!%3D

!%3D是 的URL 编码形式!=,因此您的 REST API 将对运算符进行解码并将其解释为grade != 8.

另一种方法是在 HTTP 请求正文中传递值和运算符。这样的事情可能会起作用(以 JSON 中提供的正文为例):

GET /students
Content-Type: application/json

{ "grade": {"value": 8, "operator": "!=" } }

这可能很好,因为您不必在 中重复单词“等级” gradeOperator,运算符只是嵌套在 JSON 对象中作为grade.

在任一解决方案中,您都可以定义任意数量的运算符,包括<, >, >=,<=等。只要确保正确清理您的 API 接收到的任何输入运算符,尤其是在数据库查询中使用时,以避免诸如SQL 注入攻击之类的事情。

于 2013-02-28T07:33:29.680 回答