加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如果结果集可以更改,如何使用RESTful API实现强大的分

发布时间:2020-12-16 18:54:53 所属栏目:安全 来源:网络整理
导读:我正在实现一个RESTful API,它将Orders作为资源公开,并通过结果集支持分页: GET /orders?start=1end=30 其中分页的订单按ordered_at时间戳排序,降序.这基本上是来自SO问题Pagination in a REST web application的方法#1. 如果用户请求第二页订单(GET / orde
我正在实现一个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";
}

如果项目在中间插入或删除,则此方法会中断.在这种情况下,您应该使用一些自动递增持久值而不是索引.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读