想问问各位 restful 风格的 url 设计问题

2017-08-11 14:13:00 +08:00
 lml12377

遇到这样一个问题,首先是个博客平台,需要获取日志 diary,所以针对日志的 api url 设计为:

/diaries

GET 获取,POST 发表,PUT 修改。

但是用户的博客有日志,其实主域名还有日志的聚合(比如 “发现” 栏目),另外用户是以 domain 短域名进行查询的,比如 /people/lemonlone,这个时候就有个问题,我是应该分开来设计比如:

/people/lemonlone/diaries
/diaries/hot

还是聚合到一起?

/diaries/people/lemonlone
/diaries/hot

另外分页的话,应该是通过 GET 查询参数来进行,还是用斜杠?

/diaries/page/1
/diaries?page=1

求解答!

2330 次点击
所在节点    程序员
11 条回复
terry0314
2017-08-11 14:28:43 +08:00
/diaries/people/lemonlone
/diaries?page=1
个人更喜欢这两种。
rwecho
2017-08-11 14:35:47 +08:00
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
第六:

如果记录数量很多,服务器不可能都将它们返回给用户。API 应该提供参数,过滤返回结果
下面是一些常见的参数。
```
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
```
参数的设计允许存在冗余,即允许 API 路径和 URL 参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。
lml12377
2017-08-11 14:41:14 +08:00
@terry0314 其实我个人也偏向这两种
lml12377
2017-08-11 14:43:55 +08:00
@rwecho 明白了,谢谢
tianshuang
2017-08-11 14:49:10 +08:00
Mutoo
2017-08-11 14:50:14 +08:00
先项目,赶紧上 graphql 啊,别再 restful 了!
geelaw
2017-08-11 14:52:46 +08:00
page=几 这种设计容易导致错过一些内容。一个简单的想法是传入看到的最后一个对象 id,下次从下一个开始返回。

更好的方法是让客户端不需要知道怎么查看“下一页”,把分页 API 的下一页地址在本次查询返回。
XiaoFaye
2017-08-11 14:59:27 +08:00
@Mutoo 在正式项目里乱试新技术是找死。。。
zonghua
2017-08-11 15:09:17 +08:00
@XiaoFaye 有人直接拿 RPC (如:Thrift )在 Web 端使用的吗? REST 做数据校验和文档太烦人了。
watsy0007
2017-08-11 15:48:13 +08:00
restful 是按资源来的。
按照业务需求,设计资源返回数据。
也就是看你接口的业务描述更偏向于哪种。
针对用户的,当然是用户层面的。
针对聚合的,是聚合的资源组织。
如果 2 种业务需求都有,当然可以都要。
最好不要 1 个资源满足不同的业务需求。以后改的时候会死人。
page limit 属于参数 。
hantsy
2017-08-12 10:32:05 +08:00
如果你公司不在乎标准,就用好与不好去区别 API 设计。

如果需要严格按规范来,看看相关的规范。

page 可用参数,也可用在 Header 中。

HAL 标准实现了 Richardson Mature Model Level 3,对查询结果格式作了规范。类似的规范草案还有几个,REST 不是规范,但用于交互的数据格式有不少规范。

http://stateless.co/hal_specification.html
https://tools.ietf.org/html/draft-kelly-json-hal-08

用 Spring 的话,简单的分面直接返回 Spring Page 类就行了。严格按 HAL 来的话,之前项目用 Spring HATEOAS 去实现。其它语言一样,可找到很多类似的框架或工具。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382197

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX