我正在使用ROA(资源导向架构)为我的应用程序构建REST接口。
我想让客户端能够在URL中指定搜索参数。所以客户可以说“给我所有的人:
我在想这样的事情:
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,我不知道这是否有所作为。
答案 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更新了有关此内容的更多详情和见解。我觉得你可能觉得这很有用。