在设计有关分页的Restful API时,有啥好的实践吗?

Friskit
  • 143

例如我需要查询userid在[100,200]区间的结果,大家一般怎么做?

我能想到这些(都是get):
/users/from/100/to/200
/users/100/200
/users?from=100&to=200
/users?start=100&per_page=100

大家有啥好的建议么?怎么写能看起来比较干净?

回复
阅读 17.7k
9 个回答
developerworks
  • 1.6k
✓ 已被采纳

直接使用/users集合,URL不带任何参数,
所有分页参数全部在请求头中设置, 按照REST设计的最佳实践, 响应中应该包含指向当前页的链接,用代码self标识, 指向集合中上一页的指示符prev, 下一页指示符next, 还应该包含一个total标识集合的数量.

这个在RESTful Web Services Cookbook 中文版第43页(3.7 如何设计集合表述)有描述.

PDF下载地址: http://vdisk.weibo.com/s/31DEe

杨益
  • 3.2k

/users/from/100/to/200
烂,这种不分青红皂白把参数全部搞成目录的方式烂爆了
这么搞的人实际上根本不理解REST

/users/100/200
语义缺失,不好

/users?from=100&to=200
这个很正常,我会用这个

/users?start=100&per_page=100
start和page size的设计有点怪,一般都是from / to,或者 page / page size

但是,你的真正问题其实不是分页,而是userid在[100,200]区间的过滤条件,前面哪些url设计都偏离到分页的方式上去了

分页是请求 /users 资源集合,以userid排序,从x条开始,每次取y条

你的问题是请求 /users 资源集合,过滤条件为userid在100到200之间

/users?by=userid&gte=100&lte=200
by 以哪个属性过滤
gte 大于等于
lte 小于等于

这种东西说白了都是 db 层面的,MySQL 就 limit 了

/users?page=1
至于startpagesize,似乎没有必要放在url里

?limit=10&offset=10

看这个咋样

后两种比较好
如果只是个别页面需要,那就用 /users?from=100&to=200
如果是分页的话,就是后一个/users?start=100&per_page=100
分页/users?page=1这种更好,per_page 放在controller里更好。

要分页的话我都酱紫。
/user-page-{pageIndex} /user-page-1

但你说的是查询参数了。
/user/{start}-{end} /user/100-200

如果不需要total只需要has_next的话:

后台取数据时多取1个 返回数量如果大于page_size has_next = true; 否则为false

宣传栏