如何在 REST API 中表达查询参数之间的高级表达式?
How to express advanced expressions between query parameters in a REST API?
问题(或缺失的特征)是不同查询参数之间缺乏表达的可能性。正如我所见,您只能在参数之间指定 and
,但是如果您想要 not equal
、or
或 xor
,您如何解决它?
我希望能够表达如下内容:
所有年龄在 20 岁或姓名为 Bosse 的用户
/users?age=22|name=Bosse
除了 David 和 Lennart 之外的所有用户
/users?name!=David&name!=Lennart
我的第一个想法是使用一个名为 _filter 的查询参数,并用我的表达式获取一个字符串,如下所示:
所有年龄在 22 岁或名字不是 Bosse 的用户
/users?_filter=age eq 22 or name neq Bosse
这个问题的最佳解决方案是什么?
我正在用 Java 和 Jersey 编写我的 API,所以如果 Jersey 有任何特殊的解决方案,请告诉我。
好的,就在这里
您可以添加 + 或 - 来包含或排除,以及用于 AND 和 OR
的包含性过滤器关键字
For excluding
GET /users?name=-David,-Lennart
For including
GET /users?name=+Bossee
For OR
GET /users?name=+Bossee&age=22&inclusive=false
For AND
GET /users?name=+Bossee&age=22&inclusive=true
通过这种方式,API 非常直观,可读性很强,也可以完成您希望它完成的工作。
编辑 - 非常非常难的问题,但是我会这样做
GET /users?name=+Bossee&age=22&place=NewYork&inclusive=false,true
这意味着第一个关系不包含 - 或者换句话说它是 OR
第二个关系是包容性的 - 或者换句话说它是 AND
解决方案是考虑到从左到右计算。
我可以看到两种解决方案:
在执行 GET
方法时使用包含表达式的特殊查询参数。这是 OData 使用其 $filter
参数的方式(请参阅此 link:https://msdn.microsoft.com/fr-fr/library/gg309461.aspx#BKMK_filter)。这是一个示例:
/AccountSet?$filter=AccountCategoryCode/Value eq 2 or AccountRatingCode/Value eq 1
Parse.com 也使用这种方法及其 where
参数,但查询是使用 JSON 结构描述的(请参阅此 link: https://parse.com/docs/rest/guide#queries).这是一个示例:
curl -X GET \
-H "X-Parse-Application-Id: ${APPLICATION_ID}" \
-H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
-G \
--data-urlencode 'where={"score":{"$gte":1000,"$lte":3000}}' \
https://api.parse.com/1/classes/GameScore
如果难以描述,您也可以使用 POST
方法并在请求负载中指定查询。 ElasticSearch 使用这种方法来支持查询(参见 link:https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html)。这是一个示例:
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{
"query": {
"bool" : {
"must" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
'
希望对你有帮助,
蒂埃里
嘿,如果您使用查询参数,这似乎是不可能的...
如果是高级表达式,请使用 PathParams,这样您就可以使用正则表达式进行过滤。
但要仅允许特定名称="Bosse",您需要编写严格的正则表达式。
不要仅仅为了条件而采用 REST 端点,而是允许任何名称值,然后您需要编写逻辑以在程序中手动检查。
问题(或缺失的特征)是不同查询参数之间缺乏表达的可能性。正如我所见,您只能在参数之间指定 and
,但是如果您想要 not equal
、or
或 xor
,您如何解决它?
我希望能够表达如下内容:
所有年龄在 20 岁或姓名为 Bosse 的用户
/users?age=22|name=Bosse
除了 David 和 Lennart 之外的所有用户
/users?name!=David&name!=Lennart
我的第一个想法是使用一个名为 _filter 的查询参数,并用我的表达式获取一个字符串,如下所示:
所有年龄在 22 岁或名字不是 Bosse 的用户
/users?_filter=age eq 22 or name neq Bosse
这个问题的最佳解决方案是什么?
我正在用 Java 和 Jersey 编写我的 API,所以如果 Jersey 有任何特殊的解决方案,请告诉我。
好的,就在这里 您可以添加 + 或 - 来包含或排除,以及用于 AND 和 OR
的包含性过滤器关键字For excluding
GET /users?name=-David,-Lennart
For including
GET /users?name=+Bossee
For OR
GET /users?name=+Bossee&age=22&inclusive=false
For AND
GET /users?name=+Bossee&age=22&inclusive=true
通过这种方式,API 非常直观,可读性很强,也可以完成您希望它完成的工作。
编辑 - 非常非常难的问题,但是我会这样做
GET /users?name=+Bossee&age=22&place=NewYork&inclusive=false,true
这意味着第一个关系不包含 - 或者换句话说它是 OR 第二个关系是包容性的 - 或者换句话说它是 AND
解决方案是考虑到从左到右计算。
我可以看到两种解决方案:
在执行
GET
方法时使用包含表达式的特殊查询参数。这是 OData 使用其$filter
参数的方式(请参阅此 link:https://msdn.microsoft.com/fr-fr/library/gg309461.aspx#BKMK_filter)。这是一个示例:/AccountSet?$filter=AccountCategoryCode/Value eq 2 or AccountRatingCode/Value eq 1
Parse.com 也使用这种方法及其
where
参数,但查询是使用 JSON 结构描述的(请参阅此 link: https://parse.com/docs/rest/guide#queries).这是一个示例:curl -X GET \ -H "X-Parse-Application-Id: ${APPLICATION_ID}" \ -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \ -G \ --data-urlencode 'where={"score":{"$gte":1000,"$lte":3000}}' \ https://api.parse.com/1/classes/GameScore
如果难以描述,您也可以使用
POST
方法并在请求负载中指定查询。 ElasticSearch 使用这种方法来支持查询(参见 link:https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html)。这是一个示例:$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{ "query": { "bool" : { "must" : { "query_string" : { "query" : "some query string here" } }, "filter" : { "term" : { "user" : "kimchy" } } } } } '
希望对你有帮助, 蒂埃里
嘿,如果您使用查询参数,这似乎是不可能的... 如果是高级表达式,请使用 PathParams,这样您就可以使用正则表达式进行过滤。
但要仅允许特定名称="Bosse",您需要编写严格的正则表达式。
不要仅仅为了条件而采用 REST 端点,而是允许任何名称值,然后您需要编写逻辑以在程序中手动检查。