提供复杂的过滤REST API

时间:2013-02-21 00:03:31

标签: api rest

因此,我正在使用Laravel 4 PHP Framework构建RESTful(尽可能RESTful)API。现在我有几十个API调用工作,我有一个进行限制,排序和简单过滤的过程。以下是其中一个调用的示例:

/api/v1/users?limit=10&offset=10&firstName=John&order[]=createdTimestamp desc

这将返回第11个到第20个用户,这些用户的第一个名称由createdTimestamp按降序排序。这里的简单过滤只能进行完全匹配(=)。现在,我还希望能够通过REST API提供更复杂的过滤系统,该系统支持以他们可以执行的方式特定相等匹配类型的能力!=或>或LIKE等...问题是我不知道我是否能够通过普通的查询字符串提供这种类型的过滤。

通过REST API提供此复杂过滤的最佳方法是什么?即使它不是“真正的”RESTful,通过POST仍然被认为是最好的方式(即使这会阻止用户尝试运行超过某些浏览器的URI字符长度限制的长查询的问题)?

2 个答案:

答案 0 :(得分:1)

@ryanzec

  

现在我也希望能够提供更复杂的过滤系统   通过支持特定功能的REST API   平等匹配类型,他们可以这样做!=或>或者喜欢......   问题是我不知道我是否能够提供   这种类型的过滤通过普通的查询字符串。

使用简单的查询字符串是不可能的(好吧,也许它是可能的,但很难在查询字符串中正确编码这样的逻辑)。您需要定义自定义查询格式并使用POST提交此类查询。服务器可能会回复:

  • “201 Created”状态和“Location”标题字段,表示之前没有此类查询的查询资源;或
  • “303 See Other”和“Location”标题字段,指示已存在的查询资源。
  

通过POST做的事情仍然被认为是最好的方式,即使它   不是“真正的”RESTful

我不知道是谁说的,但这是错的。将POST用于此类目的没有任何问题。

答案 1 :(得分:0)

在集合资源响应中使用表单,告诉客户端如何搜索集合。有关示例,请参阅my answer to REST and complex search queries