如何在 REST API 中表达查询参数之间的高级表达式?

How to express advanced expressions between query parameters in a REST API?

问题(或缺失的特征)是不同查询参数之间缺乏表达的可能性。正如我所见,您只能在参数之间指定 and,但是如果您想要 not equalorxor,您如何解决它?

我希望能够表达如下内容:

所有年龄在 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 端点,而是允许任何名称值,然后您需要编写逻辑以在程序中手动检查。