【问题标题】:Building filter/query string for RESTful API为 RESTful API 构建过滤器/查询字符串
【发布时间】:2013-08-15 09:04:56
【问题描述】:

我正在使用 Microsoft ASP.NET WebAPI 构建 RESTful API。我的问题涉及 GET 方法,或者更具体地说,是在 URL 中构建查询/过滤字符串的最佳解决方案。

在我的应用程序中,RESTful API 充当代理,或访问我存储在数据库中的资源的访问点。它旨在检索、插入、修改或删除记录。整个系统只存储一种类型的实体,这很复杂,因为它通常包含许多不同的字段、列表和数据。我使用 NoSQL 来存储这些实体,因为它们有很多。

问题在于创建正确的查询字符串,以便按指定条件检索这些实体。经典查询字符串如下所示:

http://localhost/api/entities?field1=val1&field2=val2&field10=val3

这种查询字符串的问题是它只允许通过相等运算符指定字段值,并且每个字段之间没有逻辑运算符的位置(&被视为有点与运算符)。

我需要的是允许指定更复杂的查询字符串,更像是过滤器。我想允许告诉系统,我想获取记录,例如:

field1 >= value1 OR field2=value2 AND field3 ~ value3

~ 表示我想使用 FUZZY 算法将 field3 与 value3 匹配(尽管我不确定 ~ 是否是表示使用模糊搜索意图的正确字符)。

好吧,正如您所见,经典查询字符串无法支持这一点。现在,我正在传递这样的查询字符串:

http://localhost/api/entities?query=field1>=value1$OR$field2=value2$AND$field3~value3

我将这样的过滤器作为一个字符串传递给我的控制器的方法并手动解析它。我的分隔符是'$',因为如果它们之间有'&'字符,ASP.NET WebAPI 会自动拆分这些参数,我不希望它这样做,因为它无法映射逻辑运算符(OR、AND、等)在这种情况下方法参数。我不确定我是否通过手动解析此字符串('?' 字符之后的所有内容)来做正确的事情:

field1>=value1$OR$field2=value2$AND$field3~value3

我的问题是:

  1. 在 RESTful API URL 中表示此类查询的正确方法是什么?
  2. 除了编写我自己的解析算法之外,是否有任何现有的解决方案可以在 ASP.NET WebAPI 中支持此类过滤器?

【问题讨论】:

    标签: rest get asp.net-web-api query-string


    【解决方案1】:

    我建议您查看 OData。它内置在 web api (http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api) 中。如果您从数据中构建域对象并尝试使用这些对象,这可能具有挑战性,但如果您的对象直接来自数据库,那么它可能非常强大。我不确定你的模糊匹配,但可以在http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options 看到一些过滤示例。

    【讨论】:

    • 好吧,我的数据对象具有与数据库中相同的属性架构,但我使用 NoSQL (ElasticSearch)。我不确定 OData 是否是依赖于数据库的解决方案,以及它是否支持 NoSQL。
    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2013-06-10
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多