我正在寻找关于在进行REST API调用时过滤资源的概念的一些指导/建议/输入。假设我有用户和帖子,用户创建帖子。如果我想获得所有帖子,我可能会有如下路线:
GET /api/posts
现在,如果我想获取在特定日期之后创建的所有帖子,我可能会添加一个像这样的过滤器参数
GET /api/posts?created_after=2017-09-01
但是,假设我希望获取在特定日期之后创建的用户的所有帖子。这是正确的格式吗?
GET /api/posts?user.created_after=2017-09-01
在过滤,分组等方面,我很难找到适合REST API的方法,特别是在使用分页API时。如果我这样做客户端(这是我最初的想法),那么根据符合条件的情况,您可能每页最终获得可变数量的资源。将所有这些逻辑作为查询参数添加到API上似乎很复杂,但我看不到任何其他方法。这种事情有标准吗?
答案 0 :(得分:1)
没有客观的权利'办法。如果在API的上下文中使用user.created_after
逻辑上有意义,那么它就没有什么问题。
答案 1 :(得分:1)
就个人而言,我不会使用user.created_after
。
我更愿意选择以下选项之一:
选项I:/api/posts/users/{userid}?created_after=2017-09-01
选项II:/api/posts/?user={userid}&created_after=2017-09-01
原因很简单:创建动态查询参数对我来说是错误的。相反,您可以组合查询参数(选项II),甚至可以定义更具体的资源(选项I)。
关于分页:标准方法是这样的:除了过滤器参数,您还可以定义以下参数:页面和 pageSize 。构建请求时,客户端将指定page=2&pageSize=25&orderBy=creationDate
之类的内容。
重要的是要注意服务器必须始终验证参数并且可能忽略或覆盖不正确的参数(例如,页面不存在,或者pageSize太大可能不会返回错误,而是返回合理的输出。这实际上取决于您的业务情况下)