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

为RESTful API构建过滤器/查询字符串,rest,get,asp.net-web-api,query-string,Rest,Get,Asp.net Web Api,Query String,我正在使用Microsoft ASP.NET WebAPI构建RESTful API。我的问题涉及GET方法,或者更具体地说,在URL中构建查询/筛选字符串的最佳解决方案 在我的应用程序中,RESTfulAPI充当代理,或者访问存储在数据库中的资源。它用于检索、插入、修改或删除记录。整个系统只存储一种类型的实体,这相当复杂,因为它通常包含许多不同的字段、列表和数据。我使用NoSQL存储这些实体,因为它们有很多 问题在于创建适当的查询字符串,以便通过指定的条件检索这些实体。经典查询字符串如下所示:

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

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

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

http://localhost/api/entities?field1=val1&field2=val2&field10=val3
这种查询字符串的错误在于,它只允许通过相等运算符指定字段值,并且每个字段之间没有逻辑运算符的位置(&被视为and运算符)

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

field1>=value1或field2=value2和field3~value3

~is表示我希望使用模糊算法将字段3与值3进行匹配(尽管我不确定~is是否是表示使用模糊搜索意图的合适字符)

正如您所看到的,经典查询字符串无法支持这一点。现在,我将传递如下查询字符串:

http://localhost/api/entities?query=field1>=value1$OR$field2=value2$AND$field3~value3
我将这样的过滤器作为一个字符串传递给我的控制器的方法,并手动解析它。我的分隔符是“$”,因为如果这些参数之间有“&”字符,ASP.NET WebAPI将自动拆分这些参数,我不希望它这样做,因为在这种情况下,它无法将逻辑运算符(或、和等)映射到方法参数。我不确定手动解析此字符串(在“?”字符之后的所有内容)是否正确:

field1>=value1$OR$field2=value2$AND$field3~value3
我的问题是:

  • 在RESTful API URL中表示此类查询的正确方式是什么
  • 除了编写自己的解析算法外,ASP.NET WebAPI中是否存在支持此类过滤器的现有解决方案

  • 我建议你去OData看看。它内置于webapi()中。如果您正在从数据构建域对象并尝试使用这些对象,这可能是一个挑战,但是如果您的对象直接来自数据库,它可能非常强大。我不确定您的模糊匹配,但可以在上看到它能够进行过滤的一些示例。

    嗯,我的数据对象与数据库中的属性模式相同,但我使用NoSQL(ElasticSearch)。我不确定OData是否是依赖于数据库的解决方案,以及它是否支持NoSQL。