首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >REST过滤器操作符最佳实践

REST过滤器操作符最佳实践
EN

Stack Overflow用户
提问于 2014-09-29 16:18:41
回答 5查看 74.6K关注 0票数 33

我正在构建一个REST,它使用一个filter参数来控制搜索结果。例如,可以通过以下方式搜索用户:

代码语言:javascript
复制
GET /users/?filter=name%3Dfoo

现在,我的API应该允许许多不同的filter操作符。数字运算符,如equalsgreater thanless than字符串操作符,如containsbegins withends withE 113日期运算符E 214,例如year oftimediff。此外,ANDOR组合应该是可能的。

基本上,我想支持底层MySQL数据库操作符的一个子集。

我发现了许多不同的实现(两个很好的例子是谷歌分析LongJump),它们似乎使用自定义语法。

考虑到我的需求,我可能会设计一个非常类似于MySQL操作符语法的自定义语法。

,但是,我想知道是否有任何最佳实践,我应该遵循,我是否应该考虑任何其他。谢谢!

EN

回答 5

Stack Overflow用户

发布于 2014-09-29 18:23:53

你需要一个已经存在的查询语言,不要试图重新发明车轮!休息一下,这是一个复杂的问题,没有得到充分解决。应用程序必须满足一些REST约束:

  • 统一接口/超媒体作为应用程序状态的引擎: 您必须向客户发送超媒体响应,他们必须遵循这些响应中提供的超链接,而不是自己构建请求。因此,您可以将客户端与URI的结构分离。
  • 统一接口/自描述信息: 您必须发送带有语义注释的消息。这样您就可以将客户端与数据结构解耦。这样做的最佳解决方案是RDF,例如,使用打开的链接数据语音。如果您不想使用RDF,那么使用特定于供应商的MIME类型的第二个最佳解决方案,因此您的消息将是自描述性的,但是客户端需要知道如何解析您的定制MIME类型。

要描述简单的搜索链接,可以使用URI模板,例如,GET /users/{?name}将在查询字符串中等待name参数。您可以使用来自九头蛇声九头蛇声向参数(如name )添加语义。

描述临时查询是一项艰巨的任务。您必须以某种方式描述查询所包含的内容。

  • 您可以选择URI查询语言,并坚持使用URI模板,可能还可以使用hydra注释。有很多已经存在的URI查询语言,比如HTSQLOData查询 (ppl不喜欢这个),等等.
  • 您可以选择现有的查询语言,并将其发送到一个URI param中。这可以是任何你想要的,例如SQL,SPARQL,等等.你得教你的客户去做那个副词。您可以创建自己的词汇表来描述实际查询的约束。如果你不需要复杂的事情,这不应该是一个问题。我不知道已经存在的查询结构去发音,但我从不寻找它们.
  • 您可以选择现有的查询语言,并在搜索请求中将其发送到正文中。最近的HTTP客户端不缓存或支持Afaik搜索。它由webdav定义。您可以使用适当的MIME类型来描述您的查询,并且可以使用与前面解决方案相同的词汇表。
  • 您可以使用RDF查询解决方案,例如SPARQL端点三重模式片段等.因此,查询将包含语义元数据,而不是链接描述。通过SPARQL,您不需要三重数据存储,您可以将服务器端的查询转换为SQL或任何您使用的内容。您可能可以使用旋转来描述查询约束和查询模板,但这对我来说也是新的。可能还有其他解决方案来描述SPARQL查询结构..。

因此,概括地说,如果您想要一个真正的REST解决方案,您必须向您的客户描述如何构造查询,以及可以使用哪些参数、逻辑运算符。如果没有查询描述,他们就无法为用户生成HTML表单。如果您不想要REST解决方案,那么选择一种查询语言--在客户机上编写一个构建器,在服务器上编写一个解析器--仅此而已。

票数 20
EN

Stack Overflow用户

发布于 2014-10-08 13:37:49

开放数据协议(OData)

您也可以检查布吕泽,看看这个协议是如何为node.js + mongodb和使用Web的.NET项目以及使用Breeze.ContextProvider dll的EntityFramework实现的。

票数 13
EN

Stack Overflow用户

发布于 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/)中引入查询概念。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26104394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档