REST API过滤器运算符最佳实践

Hor*_*ren 25 api rest

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

GET /users/?filter=name%3Dfoo
Run Code Online (Sandbox Code Playgroud)

现在,我的API应该允许许多不同的filter运营商.数字运算符例如equals,greater than,less than,字符串运算contains,begins withends with日期运算符,例如year oftimediff.此外,ANDOR组合是可能的.
基本上,我想支持底层MySQL数据库运算符的子集.

我发现很多不同的实现(两个很好的例子是Google AnalyticsLongJump)似乎使用自定义语法.
看看我的要求,我可能会设计一个非常类似于MySQL运算符语法的自定义语法.
但是,我想知道是否建立了我应该遵循的最佳实践以及是否应该考虑其他任何事情.谢谢!

inf*_*rno 14

您需要一个已经存在的查询语言,不要试图重新发明轮子!通过REST,这很复杂,并没有完全解决问题.您的应用程序必须满足一些REST约束:

  • 统一接口/超媒体作为应用程序状态的引擎:
    您必须向您的客户发送超媒体响应,并且他们必须遵循这些响应中给出的超链接,而不是自己构建请求.因此,您可以将客户端与URI的结构分离.

  • 统一接口/自描述消息:
    您必须发送带语义注释的消息.因此,您可以将客户端与数据结构分离.这样做的最佳解决方案是RDF,例如开放式链接数据词汇.如果您不想使用RDF,那么使用特定于供应商的MIME类型的第二个最佳解决方案,因此您的消息将是自描述的,但客户端需要知道如何解析您的自定义MIME类型.

要描述简单的搜索链接,您可以使用URI模板,例如,GET /users/{?name}将等待name查询字符串中的参数.您可以使用hydra:IRITemplateMapping水螅词汇语义学添加到像paramers name.

描述即席查询是一项艰巨的任务.您必须以某种方式描述您的查询可以包含的内容.

  • 您可以选择URI查询语言并坚持使用URI模板和可能的hydra注释.有许多已经存在的URI查询语言,如HTSQL,OData查询(ppl不喜欢那个)等等......

  • 您可以选择现有的查询语言并将其发送到单个URI参数中.这可以是你想要的任何东西,例如SQL,SPARQL等......你必须教你的客户生成那个参数.您可以创建自己的词汇来描述实际查询的约束.如果你不需要复杂的东西,这应该不是问题.我不知道已经存在的查询结构descibing vocabs,但我从来没有找过它们...

  • 您可以选择现有的查询语言,并在SEARCH请求中将其发送到正文中.最近的HTTP客户端不缓存或支持Afaik SEARCH.它由webdav定义.您可以使用正确的MIME类型描述您的查询,并且可以使用与先前解决方案相同的词汇.

  • 您可以使用RDF查询解决方案,例如SPARQL端点三重模式片段等...因此,您的查询将包含语义元数据,而不是您的链接描述.通过SPARQL,您不需要三重数据存储,您可以将服务器端的查询转换为SQL,或者您使用的任何内容.您可以使用SPIN来描述查询约束和查询模板,但这对我来说也是新的.可能还有其他解决方案来描述SPARQL查询结构......

总而言之,如果您想要一个真正的REST解决方案,您必须向您的客户描述他们如何构建查询以及他们可以使用哪些参数,逻辑运算符.如果没有查询描述,他们将无法为用户生成例如HTML表单.如果您不想要REST解决方案,那么选择查询语言在客户端上编写构建器,在服务器上编写解析器,这就是全部.


ser*_*gio 9

开放数据协议(OData)

您也可以查看BreezeJs,看看如何使用breeze-mongodb模块为node.js + mongodb实现此协议,使用Web API和使用Breeze.ContextProvider dll的EntityFramework实现.NET项目.