RESTful API 设计问题(很基础) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
starvedcat
V2EX    Ruby on Rails

RESTful API 设计问题(很基础)

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

    我现在有

    resources :books 

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

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

    /books/1 

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

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

    是不是这样:(用 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     Solana     2792 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 14:44 PVG 22:44 LAX 06:44 JFK 09:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86