3

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

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

  • "first_name" 等于 "BOB"
  • “年龄”大于“30”
  • 按“姓氏”排序

我在想类似的事情:

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

4 回答 4

2

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

最小/最大的东西我会添加到相同的参数中。 /people?age=10,20

请注意“,”,它隐含地为您提供范围语法。我发现它具有 minAge 和 maxAge 的可读性。

对于开放范围,您可以这样做: /people?age=10,*

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

于 2010-06-01T21:33:54.773 回答
1

I have updated more details and insight on this at http://nsinfra.blogspot.in/2011/12/simplifying-restful-search.html. I feel you may find this useful.

于 2012-06-28T14:41:02.800 回答
1

我会去做这样的事情:

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

并且,注意 SQL 注入 :)

于 2010-06-01T00:49:38.633 回答
1

你为什么不考虑把搜索变成一流的资源呢?见下文,您可以在 searchQuery 中指定 objectType 以指示您正在搜索 People 资源。

/search/{searchQuery}

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

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

你也可以用 sort 做类似的事情。

于 2010-06-01T00:50:47.497 回答