我正在构建一个REST,它使用一个filter参数来控制搜索结果。例如,可以通过以下方式搜索用户:
GET /users/?filter=name%3Dfoo现在,我的API应该允许许多不同的filter操作符。数字运算符,如equals、greater than、less than、字符串操作符,如contains、begins with或ends with和E 113日期运算符E 214,例如year of或timediff。此外,AND和OR组合应该是可能的。
基本上,我想支持底层MySQL数据库操作符的一个子集。
我发现了许多不同的实现(两个很好的例子是谷歌分析和LongJump),它们似乎使用自定义语法。
考虑到我的需求,我可能会设计一个非常类似于MySQL操作符语法的自定义语法。
,但是,我想知道是否有任何最佳实践,我应该遵循,我是否应该考虑任何其他。谢谢!
发布于 2014-09-29 18:23:53
你需要一个已经存在的查询语言,不要试图重新发明车轮!休息一下,这是一个复杂的问题,没有得到充分解决。应用程序必须满足一些REST约束:
要描述简单的搜索链接,可以使用URI模板,例如,GET /users/{?name}将在查询字符串中等待name参数。您可以使用来自九头蛇声的九头蛇声向参数(如name )添加语义。
描述临时查询是一项艰巨的任务。您必须以某种方式描述查询所包含的内容。
因此,概括地说,如果您想要一个真正的REST解决方案,您必须向您的客户描述如何构造查询,以及可以使用哪些参数、逻辑运算符。如果没有查询描述,他们就无法为用户生成HTML表单。如果您不想要REST解决方案,那么选择一种查询语言--在客户机上编写一个构建器,在服务器上编写一个解析器--仅此而已。
发布于 2014-10-08 13:37:49
您也可以检查布吕泽,看看这个协议是如何为node.js + mongodb和使用Web的.NET项目以及使用Breeze.ContextProvider dll的EntityFramework实现的。
发布于 2014-10-06 13:35:31
通过包含一组共同的、被接受的分隔符,平等比较可以以直截了当的方式实现.使用这些分隔符将参数的值设置为string将创建一个名称/值对列表,该列表可以在服务器端轻松解析,并用于根据需要增强数据库查询。您可以使用您所选择的your来分隔OR和("&")的单个筛选短语或和(“&”),并使用双冒号(“::”)分隔名称和值。这提供了一组惟一的--足够多的分隔符来支持大多数用例,并创建了一个用户可读的查询-字符串参数。一个简单的例子将有助于澄清这一技术。假设我们希望请求名为“Todd”的用户,他们住在“丹佛”,并拥有“Grand Poobah”的头衔。
使用查询字符串完成的请求URI可能如下所示:
获取http://www.example.com/users?filter="name::todd&city::denver&title::grand poobah“
双冒号(“::”)的分隔符将属性名称与比较值分隔开来,从而使比较值包含空格更容易从服务器上的值解析分隔符。请注意,名称/值对中的属性名称与将由有效负载中的服务返回的属性名称相匹配。
案件敏感性当然是在逐个案例的基础上进行辩论的,但通常情况下,当案件被忽略时,过滤效果最好。您还可以根据需要使用星号(“*”)作为名称/值对的值部分提供外卡。对于需要更多的查询,不仅仅是简单的等式或通配符比较,引入运算符是必要的。在这种情况下,运算符本身应该是值的一部分,并在服务器端解析,而不是属性名称的一部分。当需要复杂的查询语言风格功能时,请考虑从开放数据协议(OData)筛选系统查询选项规范(http://www.odata.org/documentation/odata-version-4-0/)中引入查询概念。
https://stackoverflow.com/questions/26104394
复制相似问题