scala – 如果结果集可以更改,如何使用RESTful API实现强大的分
我正在实现一个RESTful API,它将Orders作为资源公开,并通过结果集支持分页:
GET /orders?start=1&end=30 其中分页的订单按ordered_at时间戳排序,降序.这基本上是来自SO问题Pagination in a REST web application的方法#1. 如果用户请求第二页订单(GET / orders?start = 31& end = 60),服务器只需重新??查询订单表,再次按ordered_at DESC排序,并返回位置31到60的记录. 我遇到的问题是:如果在用户查看记录时结果集发生变化(例如添加了新订单)会发生什么?在添加新订单的情况下,用户将在第二页结果的第一个位置看到旧订单#30(因为相同的订单现在是#31).更糟糕的是,在删除的情况下,用户在第二页(#31)的第一个位置看到旧订单#32,并且根本看不到旧订单#31(现在#30). 如果不以某种方式使RESTful服务器有状态(urg)或为每个客户端构建一些分页智能,我无法看到解决方案……有哪些已建立的技术可以解决这个问题? 为了完整性:我的后端是在Scala / Spray / Squeryl / Postgres中实现的;我正在构建两个前端客户端,一个在backbone.js中,另一个在Python Django中. 解决方法
我这样做的方法是将索引从旧到新.所以他们永远不会改变然后在没有任何启动参数的情况下查询时,返回最新页面.此外,响应应包含一个索引,指示包含哪些元素,因此您可以计算下一个旧页面请求的索引.虽然这不是你想要的,但对我来说这似乎是最简单,最干净的解决方案.
初始请求:GET / orders?count = 30返回: { "start"=1039; "count"=30; ...//data } 由此消费者计算出他想要求: 下一个请求:GET / orders?start = 1009& count = 30然后返回: { "start"=1009; "count"=30; ...//data } 您也可以返回指向下一页的链接,而不是原始索引: { "next"="/orders?start=1009&count=30"; } 如果项目在中间插入或删除,则此方法会中断.在这种情况下,您应该使用一些自动递增持久值而不是索引. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- apt-key命令在shell上运行但在Dockerfile上失败
- angularjs – Firebase $authWithOAuthRedirect在
- scala – found单位:required Int.为什么错误不
- angularjs – 如何在Angular2中显示和隐藏带有复
- 在Scala中创建GUI但没有Swing / AWT
- Vim,Javascript,DoctorJS(jsctags)和Taglist(源代
- scala – 只有转换函数至少有两个参数时,才能将函
- Soap WebService +pull解析
- angularjs – socket.io手动将用户添加到房间(no
- 将所有主机环境变量传递给docker容器的最简单方法