REST:按相关资源的属性筛选主资源

REST:按相关资源的属性筛选主资源,rest,api,filter,group-by,relationship,Rest,Api,Filter,Group By,Relationship,我正在寻找一些关于在进行RESTAPI调用时过滤资源的概念的指导/建议/输入。假设我有用户和帖子,用户创建了一个帖子。如果我想获得所有帖子,我可能会有如下路线: GET /api/posts 现在,如果我想获得在某个日期之后创建的所有帖子,我可能会添加一个过滤器参数,如下所示 GET /api/posts?created_after=2017-09-01 但是,假设我想获得用户在某个日期之后创建的所有帖子。这是正确的格式吗 GET /api/posts?user.created_after=

我正在寻找一些关于在进行RESTAPI调用时过滤资源的概念的指导/建议/输入。假设我有用户和帖子,用户创建了一个帖子。如果我想获得所有帖子,我可能会有如下路线:

GET /api/posts
现在,如果我想获得在某个日期之后创建的所有帖子,我可能会添加一个过滤器参数,如下所示

GET /api/posts?created_after=2017-09-01
但是,假设我想获得用户在某个日期之后创建的所有帖子。这是正确的格式吗

GET /api/posts?user.created_after=2017-09-01

当涉及到过滤、分组等问题时,我很难为RESTAPI找到正确的方法,尤其是在使用分页API时。如果我做这个客户端(这是我最初的想法),那么根据满足您的标准,您可能会得到每页可变数量的资源。通过API添加所有这些逻辑作为查询参数似乎很复杂,但我看不到任何其他方法。这类事情有标准吗?

没有客观的“正确”方法。如果使用
user.created\u after
在您的API上下文中在逻辑上是合理的,那么它就没有什么问题。

就我个人而言,我不会使用
user.created\u after

我宁愿选择以下选项之一:

选项一:
/api/posts/users/{userid}?在=2017-09-01之后创建

选项二:
/api/posts/?user={userid}&created\u之后=2017-09-01

原因很简单:在我看来,创建动态查询参数是错误的。相反,您可以组合查询参数(选项II),甚至可以定义更具体的资源(选项I)

关于分页:标准方法是这样的:除了过滤器参数外,还定义以下参数:pagepageSize。构造请求时,客户端将指定类似于
page=2&pageSize=25&orderBy=creationDate
的内容。 需要注意的是,服务器必须始终验证参数,并且可能忽略或覆盖不正确的参数(例如,页面不存在,或者页面大小太大可能不会返回错误,而是返回合理的输出。这取决于您的业务情况)