Java 如何在RESTAPI中表达查询参数之间的高级表达式?
问题(或缺少特征)是不同查询参数之间缺乏表达的可能性。在我看来,只能在参数之间指定Java 如何在RESTAPI中表达查询参数之间的高级表达式?,java,rest,jersey,jax-rs,resteasy,Java,Rest,Jersey,Jax Rs,Resteasy,问题(或缺少特征)是不同查询参数之间缺乏表达的可能性。在我看来,只能在参数之间指定和,但是如果希望不等于、或或异或,如何解决这个问题 我希望能够表达如下内容: 所有年龄为20岁或姓名为Bosse的用户 /用户?年龄=22 |姓名=Bosse 除David和Lennart之外的所有用户 /用户?名字=大卫&名字=伦纳特 我的第一个想法是使用一个名为_filter的查询参数,用我的表达式获取一个字符串,如下所示: 所有年龄为22岁或名称不是Bosse的用户 /用户?\u过滤器=年龄eq 22或名称n
和
,但是如果希望不等于
、或
或异或
,如何解决这个问题
我希望能够表达如下内容:
所有年龄为20岁或姓名为Bosse的用户
/用户?年龄=22 |姓名=Bosse
除David和Lennart之外的所有用户
/用户?名字=大卫&名字=伦纳特
我的第一个想法是使用一个名为_filter的查询参数,用我的表达式获取一个字符串,如下所示:
所有年龄为22岁或名称不是Bosse的用户
/用户?\u过滤器=年龄eq 22或名称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
这意味着第一个关系不是包容性的——或者换句话说,它是或
第二种关系是包容性的——或者换句话说,它是和
解决方案考虑到评估是从左到右的。我可以看到两种解决方案来实现这一点:
- 在执行
方法时使用包含表达式的特殊查询参数。这是OData使用GET
参数的方式(请参见此链接:)。以下是一个示例:$filter
/AccountSet?$filter=AccountCategoryCode/Value eq 2 or AccountRatingCode/Value eq 1
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
Parse.com在其$ 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" } } } } } '
参数中也使用了这种方法,但查询是使用JSON结构描述的(请参见此链接:)。以下是一个示例:where
/AccountSet?$filter=AccountCategoryCode/Value eq 2 or AccountRatingCode/Value eq 1
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
$ 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" } } } } } '
- 如果它太难描述,您还可以使用
方法并在请求负载中指定查询ElasticSearch将这种方法用于其查询支持(请参见以下链接:)。以下是一个示例:POST
/AccountSet?$filter=AccountCategoryCode/Value eq 2 or AccountRatingCode/Value eq 1
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
$ 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" } } } } } '
Thierry嘿,如果你选择queryparams,这似乎是不可能的。。。 如果需要高级表达式,请选择PathParams,这样您就可以使用正则表达式进行筛选 但要只允许一个特定的name=“Bosse”,您需要编写一个严格的正则表达式
不只是为了条件而使用REST端点,而是允许任何名称值,然后您需要在程序中编写逻辑以手动检查。正如我所知,对于这个用例没有现成的解决方案。如您所说,在筛选器属性中传输查询,并通过解析筛选器和对解析表达式作出反应来实现查询。您可以对这些字符进行编码:@Thevenin:您能举个例子说明我如何使用它吗?您可能可以从.Hmn中获得一些启发,我知道这并不能回答你的问题,但对我来说,整个方法似乎有些过头了。大多数过滤器可以很容易地在客户端实现。唯一好的查询操作是字母数字范围、排序和常规分页。很多时候,对于客户端应用程序来说,在本地拥有完整的数据集是最方便的情况,因为这样可以减少对远程服务的依赖。此外,如果这类应用程序必须自己实现过滤功能,那么在您更改某些内容时,它们将更加稳定!无论如何,我相信有人会想出一个很好的解决方案。我不喜欢这个解决方案。当它是默认行为时,为什么要添加“+”?
inslusive=true
是什么意思?我的猜测是,这意味着我希望在之前的查询参数之间有一个或
。如果我想在同一个语句中同时表达和
以及或
,该怎么办?我可能会误解你的答案,如果是这样,请澄清。+
符号(有时)用于对空格进行编码,因此我不会给出它的含义。如果我将代码> >代码>作为默认行为,只使用<代码>=<代码>,就可以了。剩下的问题仍然是我如何用这个解决方案表达像(x==1 | | x==2)和&y==GURP
,我想我不明白你的意思。你能举个例子吗?谢谢你的回答。我非常喜欢parse.com的解决方案,所以我想我会尝试实现它。如果没有更好的答案出现,我会在几天内接受你的答案(在我进行测试实现之后)。不客气!很明显,使用JSON描述查询具有优势,特别是对于节点应用程序;-)