我在为休息服务设计URL时遇到一些困难,该休息服务可以基于作为一种操作的分页处理对客户的请求,或者请求大于或小于运算符作为另一种类型的操作.例如:
分页:
GET /customers/0/100
Run Code Online (Sandbox Code Playgroud)
这将为第0页获得100个客户.
大于/小于:
我还需要一个URL设计来获得id大于n的客户(比如说716).你如何在网址中加入"大于"或"小于".我必须记住,字符">"和"<"在网址中是非法的.我认为这个网址设计看起来很奇怪:
GET /customers/greaterthan/716
GET /customers/lessthan/716
Run Code Online (Sandbox Code Playgroud)
我不能使用范围,因为它会与上面指定的分页模式冲突,并且在任何情况下都不是一个好的解决方案,例如:
GET /customers/716/999999999999
GET /customers/0/716
Run Code Online (Sandbox Code Playgroud)
我确信我错过了一些明显的东西 - 有没有人有更好的解决方案?
Tar*_*log 34
Pagination,greaterthan和lessthan,听起来像查询参数,因为您使用这些参数查询资源.所以你应该这样做:
/ customers?page = 1,或
/ customers?page = 1> = 716,或
/ customers?page = 1> = 716< = 819
您甚至可以限制页面大小:
/客户?页= 1> = 716< = 819&maxpagesize可= 100
其中gt代表大于(与xml-escaping相同),lt代表小于.
Afs*_*ani 16
如果你有多个参数并需要为每个参数应用一些条件,我建议你将一个JSON对象传递给params.
考虑你想做一个条件id和page:
/customers?id={"lt": 100, "gt": 30}&page={"start": 1, "size": 10}
Run Code Online (Sandbox Code Playgroud)
它表示我希望第 1 页中的Id(s)小于 100且大于 30 且页码为10的客户.
所以现在,如果你想为其他参数应用另一个条件,你可以通过以下方式完成:
/customers?id={"lt": 100, "gt": 30}&children={"lt": 5, "gt": 2}&page={"start": 1, "size": 10}
Run Code Online (Sandbox Code Playgroud)
此查询表示Id(s)小于 100且大于 30,在页码 1中页面大小为10 且小于 5且大于 2的客户.
我强烈建议您阅读有关设计RESTful API的文档:http://blog.luisrei.com/articles/rest.html
REST是一种架构风格,不应被视为特定于HTTP.URI的模式不是使架构RESTful的原因.
话虽如此,您可能希望创建URI,以便这些查询作为字符串末尾的查询参数,例如
/customers?min=0&max=76
Run Code Online (Sandbox Code Playgroud)
@Julio Faerman:
好吧,当你得到多个参数时,问题就开始了.想象一下"查看字符串为"年龄超过18且年龄小于60但超过2个孩子的客户".
您可以定义您喜欢的任何查询参数,例如:
/customers?min-age=19&max-age=59&min-children=3
Run Code Online (Sandbox Code Playgroud)
在我的例子中,min和max是整数并且是包含的.如果您愿意,可以更改.请记住,URI中的任何内容都是资源标识符的一部分.我个人的看法是,在之后的东西?等同于子句中WHERE的SQL查询的一部分(加ORDER BY和LIMIT,这里没有显示):
SELECT * FROM customers WHERE age>=19 AND age<=59 AND children>=3
Run Code Online (Sandbox Code Playgroud)
编辑:
而不是min-和max-前缀,你可以允许>,<(也许!)作为参数名的最后一个字符,所以不是min-age你有一个名为参数age>,其中,当在查询字符串的值相结合,最终看起来像age>=19: - )
显然,当比较中有等号时,你只能使用这个技巧.
一些基于 REST 的标准提供了解决此问题的适当方法。例如,https://www.hl7.org/fhir/stu3/search.html
你的问题可以这样解决:
GET /customers?id=ge500&id=lt1000
此外,OData的互操作性远高于任何行业级标准。它提出了这种风格:GET /customers?$filter=id ge 500 and id lt 1000
小智 5
这是我一直在做的事情。
假设您有一个数字字段age。
这就是网址的样子
等于:/filter/age=5
Greater Than:/filter/age[gt]=5
Greater Than Equals:/filter/age[gte]=5
Less Than:/filter/age[lt ]=5
小于等于:/filter/age[lte]=5
不等于:/filter/age[ne]=5
然后,当我将这些参数传递给后端时,我有一个脚本,该脚本仅解析密钥并将其转换为基于年龄的正确过滤器 [INSERT_OPERATOR_HERE]
| 归档时间: |
|
| 查看次数: |
39167 次 |
| 最近记录: |