REST URL设计适用于大于,小于操作

Vid*_*dar 30 api rest url

我在为休息服务设计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,greaterthanlessthan,听起来像查询参数,因为您使用这些参数查询资源.所以你应该这样做:

/ customers?page = 1,或
/ customers?page = 1> = 716,或
/ customers?page = 1> = 716< = 819

您甚至可以限制页面大小:

/客户?页= 1> = 716< = 819&maxpagesize可= 100

其中gt代表大于(与xml-escaping相同),lt代表小于.

  • 没关系.分页和更少/更多是不相关的问题.您应该识别您的资源.在您的情况下,资源是客户.分页和更少/更大是查询资源,但它仍然是相同的资源.因此,您不应该尝试在url(path-param)中插入您的功能,而应该使用查询参数.最后,您的调用将到达相同的资源类(在java中),而不是将查询参数添加到SQL查询或类似的东西. (2认同)

Afs*_*ani 16

如果你有多个参数并需要为每个参数应用一些条件,我建议你将一个JSON对象传递给params.

考虑你想做一个条件idpage:

/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


pc1*_*ter 7

REST是一种架构风格,不应被视为特定于HTTP.URI的模式不是使架构RESTful的原因.

话虽如此,您可能希望创建URI,以便这些查询作为字符串末尾的查询参数,例如

/customers?min=0&max=76
Run Code Online (Sandbox Code Playgroud)


Nic*_*nks 7

@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 BYLIMIT,这里没有显示):

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: - )
显然,当比较中有等号时,你只能使用这个技巧.


ast*_*tef 5

一些基于 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]