RESTful过滤和查询中的布尔逻辑

时间:2014-09-09 15:53:18

标签: rest uri url-parameters boolean-expression

这是someone else's question关于过滤/查询汽车列表的后续行动。建议RESTful过滤请求是将过滤器表达式放在URI的查询中,如下所示:

/cars?color=blue&type=sedan&doors=4

没关系。但是,如果我的过滤查询变得更复杂,我需要使用布尔运算符,例如:

((color=blue OR type=sedan) AND doors=4) OR color=red

也就是说,我想找一辆四门蓝色轿车或一辆四门轿车,但是如果这辆车是红色的,我会在不关心任何其他房产的情况下接受它。

在RESTful URI的查询参数中提供布尔表达式是否有任何约定?我想我可以通过创建一些新的查询表达式语言并将其放在POST中,但这似乎是一种沉重而专有的方法。别人怎么解决这个问题?

3 个答案:

答案 0 :(得分:4)

使用

是完全可以的
/cars/color:blue/type:sedan/doors:4

而不是

/cars?color=blue&type=sedan&doors=4

URL标准仅表示路径应包含层次结构部分,并且查询应包含非层次结构。由于这是map-reduce,因此使用/完全有效。

在您的情况下,您需要使用查询语言来描述过滤器。如果我是你,我会复制一个已经存在的解决方案,例如具有REST API的noSQL数据库的查询语言。

  • 我认为resource query language就是你所需要的。我想你可以这样使用它:

    /sthg?q="(foo=3|foo=bar)&price=lt=10"
    

    或忘记默认的queryString解析器,如下所示:

    /sthg?(foo=3|foo=bar)&price=lt=10
    

    我建议您阅读手册以获取更多详细信息。

  • 由于我还没有找到其他与URL兼容的查询语言,我认为唯一的另一种选择是序列化另一种查询语言并将其发送到参数中,例如SparSQL

    http://localhost:8003/v1/graphs/sparql?query=your-urlencoded-query
    

    marklogic7。 Hydra在其词汇中定义了freeTextQuery,因此他们遵循相同的方法。但我会问马库斯这件事。这是一个复杂的主题,因为根据自描述消息约束,您应该在某处描述您在URL中使用的查询语言类型。我不确定这一点。 :S

<强>结论

为了支持即席搜索查询,我们需要一种标准方法来在链接元数据中描述它们。目前,关于这一点的标准很少。最广泛使用的标准是URI templates,它不支持嵌套语句,运算符等...我所知道的。有一个名为link descriptions的草案试图填补空白,但它不完整。

使用单个q参数定义URI模板的一种可能的解决方法,该参数具有rdf:type of x:SearchQuery和rdfs:xsd:string的范围,并创建另一个关于如何描述这样的x:SearchQuery的词汇。之后,该描述可用于构建搜索表单,并验证发送到服务器的查询。使用这种方法也可以支持现有的查询,因此我们不需要新的查询。

所以这个问题可以通过词汇或新的URI模板标准来解决。

答案 1 :(得分:2)

我见过很多人使用了你提供的查询字符串 - 就像SQL查询字符串一样。

以下只是两个例子:

答案 2 :(得分:0)

尝试使用1表示true,0表示false。

/_api/web/lists/getbytitle('XYZ')/items?$filter=Active eq 1
相关问题