如何为资源收集设计REST URL,它按属性过滤资源不等于给定值?
例如,为了让学生在8年级,我们使用
GET /students?grade=8
Run Code Online (Sandbox Code Playgroud)
如果我们需要让学生不在 8年级,如何做同样的事情?以及如何设计小于(<),大于(>)等?
我正在考虑做的是将运算符作为参数的一部分,从值中分隔出来.我还将定义非符号运算符,以避免在参数名称后使用等号进行丑陋的URL编码或混淆.对于你的例子,对于不是8年级的学生,这将是这样的:
GET /students?grade=neq|8
Run Code Online (Sandbox Code Playgroud)
年级> 8的学生将是:
GET /students?grade=gt|8
Run Code Online (Sandbox Code Playgroud)
8年级和10年级(含)的学生:
GET /students?grade=gte|8,lte|10
Run Code Online (Sandbox Code Playgroud)
此方法可以扩展到其他可过滤字段,而无需添加其他参数来修改每个字段的过滤方式.
Stripe 拥有最受尊敬的 API 之一。
他们为每个运算符使用一个单独的参数,并用点分隔。
例如,要搜索创建日期:
/charges?created.gt=
/charges?created.gte=
/charges?created.lt=
/charges?created.lte=
Run Code Online (Sandbox Code Playgroud)
在你的情况下,你可以这样做:
/students?grade.gt=8&grade.lt=8
Run Code Online (Sandbox Code Playgroud)
或者甚至添加另一个运算符来表示 not:
/students?grade.not=8
Run Code Online (Sandbox Code Playgroud)
一种选择是添加额外的查询参数,例如gradeOperator您可以在其中传递要在将值与grade参数进行比较时使用的运算符。例如,
GET /students?grade=8&gradeOperator=!%3D
Run Code Online (Sandbox Code Playgroud)
!%3D是 的URL 编码形式!=,因此您的 REST API 会对运算符进行反编码并将其解释为grade != 8。
另一种方法是在 HTTP 请求正文中传递值和运算符。像这样的东西可能会起作用(以 JSON 中提供的主体为例):
GET /students
Content-Type: application/json
{ "grade": {"value": 8, "operator": "!=" } }
Run Code Online (Sandbox Code Playgroud)
这可能很好,因为您不必在 中重复“grade”一词gradeOperator,该运算符只是作为 的值嵌套在 JSON 对象内grade。
在任一解决方案中,您都可以定义任意数量的运算符,包括<、>、>=、<=等。只需确保正确清理 API 接收到的任何输入运算符(尤其是在数据库查询中使用时),以避免SQL 注入攻击等情况。
| 归档时间: |
|
| 查看次数: |
5661 次 |
| 最近记录: |