java - 移动端接口的设计问题
高洛峰
高洛峰 2017-04-18 09:54:14
0
5
1033

现有学生实体类 Student

public class Student {
    private int no;
    private String name;
    private int score;
}

需要为移动端提供数据查看学生成绩,数据源未使用数据库仅使用Java集合,若Server的数据源为List<Student>,内容如下:

0 张三 58
1 李四 42
2 王五 23

假设移动端每次请求只显示两条数据,则首次显示

0 张三 58
1 李四 42

移动端下拉页面,请求下一页数据,并将no=1发回给Server,此时移动端就多了一条数据,变为:

0 张三 58
1 李四 42
2 王五 23 --下拉后得到的新数据

若数据源固定不变这样是没有问题的,但实际情况是学生的信息会随时变化,即可能在移动端下拉请求下一页之前"1 李四 42"这条数据就没有了,此时再将no=1发回给Server会产生各种各样的问题,例如:同一条数据显示两次、有的未被显示等问题,有什么方法在不使用数据库的情况下按这种方式为移动端提供列表数据呢?想不通哇=。=

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

Antworte allen(5)
伊谢尔伦

楼上的难道没做过移动端分页嘛??移动端分页涉及到有变化的数据肯定不是按page=1这种方式来的,不然要重复或漏掉,(漏掉还好,重复客户端一下就发现了)
通用解决方案是这样的:
首先你肯定有个排序呗,比如说按时间,按分数等,客户端要下一页只需要传它当前页的最后一条记录的标识符就ok了,服务器拿到这个标识符再找后面的数据给它。
例子:
假设server端数据是1,2,3,4,5,6,7,8 返给client数据是1,2,3,这时需要3后面的数据,就把3传回server,server拿到3再按照约定逻辑找到比3大的是4,5,6给client,这样即使新增或删除都不会有重复问题
以前我们做瀑布流图片展示就是这样的,另外FB,instagram的api很多都是这样设计的

洪涛

no=1么有就找no=2

迷茫

你都不用数据库,那数据怎么还会消失呢?
分页可以吗?按照你存的list.类似如下伪代码:
`
List<x> list1 = list.subList(0,3);
List<x> list2 = list.subList(3,6);
List<x> list3 = list.subList(6,9);
`

阿神

分页列表中的数据被删除的情况确实很麻烦...

可以考虑3种解决方法:

  1. 数据量小的话不要进行分页了,直接一次性把列表中的数据全给客户端

  2. 数据量大非要分页的话,可以考虑每次不光传递要获取的那一页的数据,顺便把前面已经获取过了的页面的数据的diff(变化情况)传给客户端

  3. 如果数据变化,传给客户端一个数据有变化了的标志,让客户端刷新整个列表或者提示用户应该要刷新整个列表。

伊谢尔伦

先对students的集合按照id进行排序,然后把上一次请求最后一条数据的id和size做为请求的入参进行分页,这里的id也就是Student.no。

for(Student student:students){
  if(student.no>lastId){
      result.add(student);
      if(result.size()==size){
          return result;
      }
  }
}
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage