V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lml12377
V2EX  ›  程序员

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

  •  
  •   lml12377 · 2017-08-11 14:13:00 +08:00 · 2333 次点击
    这是一个创建于 2668 天前的主题,其中的信息可能已经有所发展或是发生改变。

    遇到这样一个问题,首先是个博客平台,需要获取日志 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
    

    求解答!

    11 条回复    2017-08-12 10:32:05 +08:00
    terry0314
        1
    terry0314  
       2017-08-11 14:28:43 +08:00   ❤️ 1
    /diaries/people/lemonlone
    /diaries?page=1
    个人更喜欢这两种。
    rwecho
        2
    rwecho  
       2017-08-11 14:35:47 +08:00   ❤️ 1
    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
        3
    lml12377  
    OP
       2017-08-11 14:41:14 +08:00
    @terry0314 其实我个人也偏向这两种
    lml12377
        4
    lml12377  
    OP
       2017-08-11 14:43:55 +08:00
    @rwecho 明白了,谢谢
    tianshuang
        5
    tianshuang  
       2017-08-11 14:49:10 +08:00
    Mutoo
        6
    Mutoo  
       2017-08-11 14:50:14 +08:00
    先项目,赶紧上 graphql 啊,别再 restful 了!
    geelaw
        7
    geelaw  
       2017-08-11 14:52:46 +08:00 via iPhone
    page=几 这种设计容易导致错过一些内容。一个简单的想法是传入看到的最后一个对象 id,下次从下一个开始返回。

    更好的方法是让客户端不需要知道怎么查看“下一页”,把分页 API 的下一页地址在本次查询返回。
    XiaoFaye
        8
    XiaoFaye  
       2017-08-11 14:59:27 +08:00
    @Mutoo 在正式项目里乱试新技术是找死。。。
    zonghua
        9
    zonghua  
       2017-08-11 15:09:17 +08:00
    @XiaoFaye 有人直接拿 RPC (如:Thrift )在 Web 端使用的吗? REST 做数据校验和文档太烦人了。
    watsy0007
        10
    watsy0007  
       2017-08-11 15:48:13 +08:00   ❤️ 1
    restful 是按资源来的。
    按照业务需求,设计资源返回数据。
    也就是看你接口的业务描述更偏向于哪种。
    针对用户的,当然是用户层面的。
    针对聚合的,是聚合的资源组织。
    如果 2 种业务需求都有,当然可以都要。
    最好不要 1 个资源满足不同的业务需求。以后改的时候会死人。
    page limit 属于参数 。
    hantsy
        11
    hantsy  
       2017-08-12 10:32:05 +08:00   ❤️ 1
    如果你公司不在乎标准,就用好与不好去区别 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 去实现。其它语言一样,可找到很多类似的框架或工具。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2589 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 03:10 · PVG 11:10 · LAX 19:10 · JFK 22:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.