如何为资源集合设计 REST url,按属性过滤资源不等于给定值?
例如,要让 8 年级的学生,我们使用
GET /students?grade=8
如果我们需要让学生不在8 年级,如何做同样的事情?以及如何设计小于(<
),大于(>
)等?
我正在考虑做的是将运算符作为参数的一部分,与值分隔。我还将定义非符号运算符以避免需要丑陋的 URL 编码或与参数名称后的等号混淆。对于您的示例,对于非 8 年级的学生来说,这将是这样的:
GET /students?grade=neq|8
年级 > 8 的学生将是:
GET /students?grade=gt|8
8 至 10 年级(含)的学生:
GET /students?grade=gte|8,lte|10
这种方法可以扩展到其他可过滤的字段,而无需添加额外的参数来修改每个字段的过滤方式。
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
一种选择是添加一个额外的查询参数,例如在将值与参数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 注入攻击之类的事情。