2015-10-14 44 views
-1

有没有人在你的REST API url中使用[]或()?[]或()在REST中Url

假设的例子:

/cars?[colors]:red,[engineType]:13 
/cars?(colors):red,(engineType):13 
  • 说给我所有汽车行驶红色和一定的发动机类型。颜色是汽车资源的一个子属性。

有没有人看到使用这些要注意的任何问题或使用相当普遍?

这是另一个例子。给我所有的城市,但只有当它的人民喝咖啡

/cities?filter=(people[drinks[type]:6]) 

城市还是我甚至可以让多台套,以这样的

/cities?filter=(people[drinks[type]:6]),(another layer of filtering)&paging=(offset:10, limit:2) 

基本上在第二执行与运算,逗号本身因为()表示过滤条件,因此我们有一个过滤条件,逗号,第二个过滤条件,所以如果在解析url值时考虑它,可以很容易地通过()和()连接到SQL超出请求并将其传递给后端的查询。

这是我的想法。

() - 表示一个过滤级别,添加多个()的多个过滤器 [] - 表示资源

的子属性,因此上述允许呼叫者说给我个城市的名单,但只那些谁喜欢喝咖啡的人(类型6)。

+1

为什么不使用JSON(http://www.json.org/)? – James

+0

我正在谈论你发送给REST API的url。你是什​​么意思 – PositiveGuy

+0

查看http://stackoverflow.com/a/19362281/4004512这个例子。 – James

回答

2

没有真正的REST官方规范,但这是非常不寻常的。执行此操作的常规方法是以key = value形式对参数进行urlencode编码。几乎所有的图书馆都会帮你做到这一点。您必须手动解析您发明的自定义格式(并且您需要找出任何转义问题;如果,[可以成为字符串的一部分,该怎么办?现在还不清楚在任何情况下括号会给您带来什么。

更常用的方式来处理,这将是:

/cars?color=red&engineType=13 
+0

对,但想更复杂。这对简单的过滤很好。想想过滤器的更深层次。如果我想要红色和色调为10的汽车,色调是颜色的子资源。如何在URL中开始指定资源的子资源等。通过使用()或[],您可以开始允许在该资源的属性和这些属性的属性链中进一步详细筛选。 – PositiveGuy

+0

查看我的更新,获取更复杂的示例和想法,我有关于允许采用一致的方式来执行更复杂的查询以及我如何在我的url中指定。 – PositiveGuy

0

有2种频繁模式我至今遇到:

  • /cars/?colors=red&engineType=13
  • /cars/colors:red/engineType:13/

在URI中使用[]或()并不常见。如果这是你的愿望,我认为你不会有任何使用它们的问题。如果您也想使用URI模板,请不要使用{}。

+0

我见过其他API,如Stormpath's,这是一个真正的API使用()和类似的东西 – PositiveGuy

+0

许多apis也使用+来允许查询语法,但我不会去那条路线 – PositiveGuy

+0

@MSSucks这是可能的我没有花太多时间来检查不同的URI结构REST APIs ...只要你的解决方案符合URI标准,就没有问题,如果不是,你可以从错误信息中得知。 – inf3rno