REST / ROA架构 - 在URL中发送数据库搜索/查询/过滤/排序参数? (>,<,IN等...)

时间:2010-06-01 00:36:18

标签: url rest url-routing restlet

我正在使用ROA(资源导向架构)为我的应用程序构建REST接口。

我想让客户端能够在URL中指定搜索参数。所以客户可以说“给我所有的人:

  • “first_name”等于“BOB”
  • “年龄”大于“30”
  • 按“last_name”排序

我在想这样的事情:

GET /PEOPLE/{query_parameters}/{sort_parameters}

......或者

GET /PEOPLE?query=<query_string>&sort=<sort_string>

...但我不确定在COLUMN_NAME-OPERATOR-VALUE中重复指定哪种语法有用。我想的可能是:

column_name.operator.value

所以客户可以说:

GET /PEOPLE?query=first_name.EQUALS.bob&query=age.GREATER_THAN.30&sort=last_name.ASCENDING

我真的不想在这里重新发明轮子,有没有一些可以接受的方法呢?我正在使用Restlets,我不知道这是否有所作为。

4 个答案:

答案 0 :(得分:2)

我会将搜索参数添加为单个参数。专用的子查询语言通常更难处理+读取(特别是因为你必须对它进行url编码)。所以我不会压缩一个完整的功能吹sql语法之一。只添加您真正需要的参数并使搜索更有意义,更少的复杂性意味着更容易处理:)

min / max stuff我会添加到相同的参数。 /people?age=10,20

注意',',它隐式地为您提供了范围语法。我发现它具有minAge和maxAge的可读性。

你可以做的开放范围: /people?age=10,*

我会做的排序: /people?sortField=name&sortOrder=ascending

答案 1 :(得分:1)

我会选择这样的事情:

获取/PEOPLE?first_name=bob&min_age=30&sort=last_name.asc,age.desc

并注意SQL注入:)

答案 2 :(得分:1)

为什么不考虑将搜索作为一流的资源?请参阅下文,您可以在searchQuery中指定objectType以指示您正在搜索People资源。

/search/{searchQuery}

例如,以下查询表示搜索30岁至50岁之间的所有人。

/search?objectType=People&ageField1=30&ageField2=50&inclusive=true

你也可以做类似的事情。

答案 3 :(得分:1)

我已在http://nsinfra.blogspot.in/2011/12/simplifying-restful-search.html更新了有关此内容的更多详情和见解。我觉得你可能觉得这很有用。