Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在RESTAPI中表达查询参数之间的高级表达式?_Java_Rest_Jersey_Jax Rs_Resteasy - Fatal编程技术网

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
这意味着第一个关系不是包容性的——或者换句话说,它是或 第二种关系是包容性的——或者换句话说,它是和


解决方案考虑到评估是从左到右的。

我可以看到两种解决方案来实现这一点:

  • 在执行
    GET
    方法时使用包含表达式的特殊查询参数。这是OData使用
    $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
    
    $ 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" }
                }
            }
        }
    }
    '
    
    Parse.com在其
    where
    参数中也使用了这种方法,但查询是使用JSON结构描述的(请参见此链接:)。以下是一个示例:

    /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" }
                }
            }
        }
    }
    '
    
  • 如果它太难描述,您还可以使用
    POST
    方法并在请求负载中指定查询ElasticSearch将这种方法用于其查询支持(请参见以下链接:)。以下是一个示例:

    /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描述查询具有优势,特别是对于节点应用程序;-)