分页第一页用0还是1_如何设计api分页

常规的分页方式

API处理分页看似简单,实际上暗藏危机。最常见的分页方式,大概是下面这样的

/users/?page=1&limit=5
//服务端返回

最理想的情况下,客户端请求第一页的5条数据,服务端如常返回,比如下图:

9dbf50c717eedb58632bb1fc1269e53c.png

拿Twitter的图用一下,假设我们的数据库有10条数据,按照5条一页,正好有2页。
在理想情况下,客户端拉取数据时不会出现任何异常。但,这仅仅是正常情况,如果此时刚好有2条新数据插入。

bb6a9dc59581a58c853447d0e3903b4d.png

数据库记录变为13。原来第二页的数据是[5, 4, 3, 2, 1],现在变为[7, 6, 5, 4, 3],我们再一次拿到了第一页的数据。同理,如果用户在拉取数据时正好有数据被删除,一样会出现类似的问题。

根据item_id分页

要解决此类问题,就不能使用常规的分页方式。现在,我们换一个思路,客户端拉取数据时不再传page,改为item_id,我们就把它称为max_id

/users/?max_id=5&limit=5

此时服务端就知道我们上次拉取到了item_id为5的数据,继续在它后面拉取5条, 如下图:

1cc42968d760b40d86d8f53eb9e1b3d7.png

数据可以正常取回,不会再出现上一页中的[6,7]。好了,让我们再一次假设,此时又有8条数据插入了数据库。再一次获取数据

3ec6072749c16ff3a722f80c0f49532e.png

可以看出,再一次出现问题,我们又拿到了上一页的[10,9]。所以,我们得告诉服务端,上一次拿到哪一条数据了。所以继续增加一个since_id字段。

d102c280aeb1fcb83fdaf9177055b2a0.png

恩,再一次取出了正确的数据。可能你觉得一切都正常了,但还是隐藏了一个致命的缺陷。

上面的数据能正常获取,是因为数据都是一个有序的集合,如果数据无序,且从数据库取出时需要按照某个字段排序,那么一切再次打回原点:所有的分页都乱了。

如何设计分页API

可以看出,两种分页方式都存在问题。所以这两种需求都是必要的,我们需要根据不同的业务场景使用不同的分页方式。

为了不造成客户端的麻烦,我们对api的分页做了一些更改。

{

我们由服务端来决定如何分页,前端需要做的,只是把next字段直接拼接到url中,这样就可以应付各种分页情况。

总结

常规的分页方式不能应付经常变更的数据,sinceid和maxid的方式不能应付有其他排序的数据。大概就是这个样子,没有一种万能的分页方案,我们只能针对具体的业务场景去设计一个弹性的API来处理复杂的分页场景。

ps: 最初我们想到的分页方案,是直接使用item_id作为拉取数据的依据,后来看到Twitter的文章,感觉有更好的分页方案,又懒得画图,所以就直接搬Twitter分页的部分了。:)

参考链接:
Working with Timelines

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据挖掘肿瘤预测_科研套路不嫌多,数据挖掘发3分

解螺旋公众号陪伴你科研的第2003天如何复现一篇3分生信研究做科研需要先学习套路,才能超越套路。今天给大家介绍的套路文献是今年发表在《Oncology reports》(IF 3.041)上的一篇文章。文章的标题虽然看上去比较泛,但也让读者一眼就能知道主题了&#xff…

Jupyter notebook 导出PDF的3种方法

很多用Jupyter notebook的都想导出PDF,但是我们点击Download as PDF via LaTex. 然后呢? Ohzzzzzzzzz 出现下图的错误,看到这里感觉糟糕透啦。虽然可以根据提供的方法解决这个问题。下面我说说我的方法吧。 方法1 打开jupyter notebook&a…

mybatis中的#{value}和${value}的区别

2019独角兽企业重金招聘Python工程师标准>>> 1. #{value}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。 2. ${value}将传入的数据直接显示生成在sql中。 3. #{value}方式能够很大程度防止sql注入。  4.${value}方式无法防止Sql注入。…

数据库备份失败问题

备份对于服务器“服务器名”失败。(Microsoft.SqlServer.Smo) 其他信息:System.Data.SqlClient.SqlError:无法打开备份设备c:\abc.bak。出现操作系统错误5(拒绝访问。)。(Microsoft.SqlServer.Smo) 解决办法: Sql Serv…

重写setTimeout扩展参数

1 //判断函数行参长度来决定是否需要重写setTimeout,ie8以下为undefined2 if(window.setTimeout.length undefined){3 var __sto window.setTimeout;4 window.setTimeout function(callback,timeout,param){5 var args Array.prototype.slice.c…

针对access数据库的增删改查

1、执行查询操作:(ExecuteReader方法) string myConnectionString "Provider Microsoft.Jet.OLEDB.4.0;Data Source "Server.MapPath("~/") "App_Data/access.mdb"; //使用相对路径连接数据库 string mySel…

pandas 在jupyter notebook时候能用,但在vscode, pycharm不能用

先看错误。 AttributeError: partially initialized module ‘pandas’ has no attribute ‘Series’ (most likely due to a circular import) 分一下这种错误 ‘…’ has no attribute ‘…’ 库没有 ’…’ 这种问题,要么库没有装好,或者装的库的…

解决 IDEA 调用其他类的时候自动加上包路径和类名的情况_idea 快捷键汇总(转)...

1.IDEA常用快捷键Alt回车 导入包,自动修正CtrlN 查找类CtrlShiftN 查找文件CtrlAltL 格式化代码CtrlAltO 优化导入的类和包AltInsert 生成代码(如get,set方法,构造函数等)CtrlE或者AltShiftC 最近更改的代码CtrlR 替换文本CtrlF 查找文本CtrlShiftSpace 自动补全代码Ctrl空格 代…

8位可控加减法器_自主可控:QTouch在军工道系统上的应用

自主可控:QTouch在军工道系统上的应用一、系统介绍"道系统"操作系统是一款面向各领域的嵌入式实时操作系统,支持单核及多核CPU硬件配置,可替换相关领域的VxWorks 6.8/6.9操作系统二、产品特性 具备自主知识产权的嵌入式实时操作系统…

截获所有以太网帧数据并进行具体分析

/* capture_packet.c - 截获所有以太网帧数据并进行具体分析 *//* 常用函数的头文件 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <unistd.h> #include <signal.h>/* 与网络相关…

Spark启动程序:Master

临时笔记def main(argStrings: Array[String]) {//读取以spark.开头的配置属性val conf new SparkConf//检查环境变量&#xff1a;SPARK_MASTER_HOST、SPARK_MASTER_PORT、SPARK_MASTER_WEBUI_PORT //再检查配置属性&#xff1a;master.ui.port //检查其他master配置&am…

iOS - Frame 项目架构

前言 iOS 常见的几种架构&#xff1a; 标签式 Tab Menu列表式 List Menu抽屉式 Drawer瀑布式 Waterfall跳板式 Springborad陈列馆式 Gallery旋转木马式 Carousel点聚式 Plus1、标签式 优点&#xff1a; 1、清楚当前所在的入口位置2、轻松在各入口间频繁跳转且不会迷失方向3、直…

Windows 10下,anaconda (conda) 虚拟环境的创建,jupyter notebook如何使用虚拟环境

手把手教您创建conda 虚拟环境 1 安装好anaconda后&#xff0c;会出现如下所示&#xff0c;这些都是anaconda集成啦&#xff0c;不需要再安装了。我们在如下所指的anaconda Prompt右键&#xff0c;以管理员运行 2 打开后&#xff0c;这就是prompt&#xff0c;我们输入pyth…

python下载文件传到服务器_python实现FTP文件传输的方法(服务器端和客户端)

用python实现FTP文件传输&#xff0c;包括服务器端和客户端&#xff0c;要求 &#xff08;1&#xff09;客户端访问服务器端要有一个验证功能 &#xff08;2&#xff09;可以有多个客户端访问服务器端 &#xff08;3&#xff09;可以对重名文件重新上传或下载 FTP&#xff08;F…

oracle数据库主键自增序列_Oracle数据库序列详解

前言&#xff1a;做过web开发的人员基本上都知道&#xff0c;数据库表中的主键值有的时候我们会用数字类型的并且自增。这样mysql、sql server中的都可以使用工具创建表的时候很容易实现。但是oracle中没有设置自增的方法&#xff0c;一般情况我们会使用序列和触发器来实现主键…

一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(9)--基于表单库的仪表板...

现在你已经知道了如何将服务台网站和表单与自定义视图放在一起&#xff0c;最后一步是使用SharePoint创建仪表板&#xff0c;以呈现表单中的信息的基本报表。表单设计者经常致力于表单以至于他们忘记了SharePoint的力量来聚合表单的属性&#xff0c;并建立KIPs和其他类型的报表…

SQL常用语句积累

SQL 常用语句积累&#xff1a;一、 SQL 基本语句SQL 分类&#xff1a;DDL —数据定义语言 (Create &#xff0c; Alter &#xff0c; Drop &#xff0c; DECLARE)DML —数据操纵语言 (Select &#xff0c; Delete &#xff0c; Update &#xff0c; Insert)DCL —数据控制语言 …

vscode 里 Import “numpy“ count not be resolved

问题如下&#xff1a; 我们分析一下这个问题&#xff0c;这里的问题。问题的翻译是&#xff1a;导入"numpy"不能被解决。 这可能有几个问题&#xff0c;1&#xff1a;vscode的python插件没有安装&#xff0c;2: vscode的python的解析器没有设置好。 按照这个思路&…

xdocument查找节点值_二叉查找树(java)

一棵二叉查找树(BST)是一颗二叉树&#xff0c;其中每个节点都含有一个Comparable的键且每个节点的键(以及相关的值)都大于其左子树中的任意节点的键而小于右子树的任意结点的键。数据表示和链表一样&#xff0c;我们嵌套定义了一个私有类来表示二叉查找树上的一个节点。每个节点…

三角形 画_CAD入门基础第3节:直角三角形的圆及如何修剪

这个软件&#xff0c;仔细想想&#xff0c;无非就两个命令&#xff0c;一是直线命令&#xff0c;二&#xff0c;就是圆。直线&#xff0c;无非也就是两种&#xff0c;一&#xff0c;是水平直线和垂直于水平直线的竖线&#xff0c;二&#xff0c;就是各种斜线。第一种直线&#…