V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
starvedcat
V2EX  ›  Ruby on Rails

RESTful API 设计问题(很基础)

  •  
  •   starvedcat · 2016-11-21 07:15:18 +08:00 · 7586 次点击
    这是一个创建于 2932 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有

    resources :books
    

    现在我想要设计 API ,显示同一个作者写的所有书

    假设, ID 为 1 的书,作者是 A ,这本书的 URI 是

    /books/1
    

    那么这个“ A 写的所有书”的 URI 应该怎么设计呢?

    这个“作者”就是一个字符串,不是一个 model

    是不是这样:(用 similar 表示同一个作者)

    /books/1/similar
    

    但是这样的话,又没有体现出 A 的名字

    第 1 条附言  ·  2016-11-22 07:46:25 +08:00

    我后来是这样做的:

    /authors/A/all_books
    /authors/A/all_books?from=1 (这样就可以在页面上添加一个返回那本书的按钮)
    
    16 条回复    2016-11-21 14:43:26 +08:00
    lslqtz
        1
    lslqtz  
       2016-11-21 07:21:22 +08:00
    /author/a/allbooks
    kitalphaj
        2
    kitalphaj  
       2016-11-21 07:24:27 +08:00
    楼上的就可以,不过还是建议把作者也作为一个 model 。
    starvedcat
        3
    starvedcat  
    OP
       2016-11-21 07:54:51 +08:00
    @lslqtz
    @kitalphaj
    多谢两位,其实我的疑问就是,在 author 不是 model 的情况下,把 author 作为 URI 的一部分合不合适?(现在看来是合适的?)
    csunny
        4
    csunny  
       2016-11-21 07:59:01 +08:00
    我以为, author 是不是 model 只是内部实现的问题,对外仍然可以作为 uri 一部分。不知道对不对。
    maemual
        5
    maemual  
       2016-11-21 08:22:39 +08:00 via iPhone
    author 是不是 model 是内部实现的问题,和接口设计没有关系。
    hanks315
        6
    hanks315  
       2016-11-21 08:47:44 +08:00 via iPhone
    /books?author=A ,这样可以么
    xia0ta0
        7
    xia0ta0  
       2016-11-21 09:06:45 +08:00
    /authors/:author/books 或者 /books?author=:author 都可以的
    tabris17
        8
    tabris17  
       2016-11-21 09:11:56 +08:00
    你就想象一下,如果这些书按照文件夹排列你会怎么放置

    /books/sorted-by-author/{author_id}
    msg7086
        9
    msg7086  
       2016-11-21 09:17:10 +08:00
    虽然 author 只是内部实现,但是 Rails 会要求你按照建模要求去建模。 Author 老老实实开一个 model 出来搞,然后什么都简单了。

    这就是 CoC 的世界。
    lijinma
        10
    lijinma  
       2016-11-21 09:34:31 +08:00
    一般两种方式:

    1. /authors/:author_id/books
    2. /books?author_id=:author_id

    参数都应该是 author_id 才对啊。另外, Model 肯定要建的,如果没有 model , author_name 只是 book 的一个属性,那么你应该这么做:

    /books?author_name=:author_name
    timestamp
        11
    timestamp  
       2016-11-21 09:54:02 +08:00
    book/{id}
    author/{id}
    author/{author}/books
    lxrmido
        12
    lxrmido  
       2016-11-21 10:28:59 +08:00
    其实,要体现作者的名字的话,参考暴雪的做法就行了:

    author#233
    lxrmido
        13
    lxrmido  
       2016-11-21 10:29:33 +08:00
    @lxrmido

    当然在 URI 里#要换成其他
    hustlike
        14
    hustlike  
       2016-11-21 12:17:55 +08:00
    books/author/{author_id}
    wizardoz
        15
    wizardoz  
       2016-11-21 12:49:37 +08:00
    /books/?author=A

    restful 并不是完全抛弃查询参数.从所有书的列表中过滤作者为 A 的所有书.用查询参数过滤我觉得没毛病.
    毕竟层次结构的 URL 只是一个一维的东西,要用来表示现实世界错综复杂的关系还是有困难.
    bravecarrot
        16
    bravecarrot  
       2016-11-21 14:43:26 +08:00 via iPhone
    觉得 11 楼的比较好,把 book 和 author 建成不同的 model ,更容易理解。
    /books/1/similar 这样很不合情理
    另外,一直觉得 url 中带问号太丑了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2603 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 06:47 · PVG 14:47 · LAX 22:47 · JFK 01:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.