构建RESTful API的过滤器/查询字符串

时间:2013-08-13 16:25:23

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

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

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

问题在于创建适当的查询字符串,以便通过指定标准检索这些实体。经典查询字符串如下所示:

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

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

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

  

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中支持此类过滤器?

1 个答案:

答案 0 :(得分:0)

我建议你查看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看到一些它能够过滤的例子。