RESTful 分页查询 API 如何设计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RiceMarch
V2EX    问与答

RESTful 分页查询 API 如何设计?

  •  1
     
  •   RiceMarch 2021-04-08 23:00:51 +08:00 3393 次点击
    这是一个创建于 1699 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在尝试写一点小东西,在设计接口时产生了一些疑惑(··(··(··*)

    在 RESTful API 中资源的获取是 GET,

    假设一个场景 需要进行分页查询,有着复杂的查询条件。

    那么我的 uri 就变成了下面这样一长串,后面携带了一长串查询条件

    /api/somethings?p=2&s=10&q=sdasdad&type=xx&time=xx&o=desc 

    但我想象中的 restful 是这样的帅气模样

    /api/somethings/p/2/s/10 .... 

    有想过用 requestbody 把查询条件进行封装,但这明显不合理。

    好奇如何设计出“好看”的 restful API 呢?(可能我对 restful 的理解还有很大的偏差...

    16 条回复    2021-04-09 17:24:54 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2021-04-08 23:09:46 +08:00
    就是一长串的
    huijiewei
        2
    huijiewei  
       2021-04-08 23:10:25 +08:00
    ?xxxxxxx 即可
    liuxey
        3
    liuxey  
       2021-04-08 23:11:18 +08:00   1
    如果要完全按照 Restful 风格,那么可以参考《 RESTful Web Services Cookbook 中文版》中的“如何设计集合表述”,但实际感觉并不是很方便,建议 /api/somethings/?p=2&s=10 一把梭
    qiayue
        4
    qiayue  
    PRO
       2021-04-08 23:11:28 +08:00
    url rewrite 可以把 p=2&s=10 变成 /p/2/s/10
    superrichman
        5
    superrichman  
       2021-04-08 23:21:58 +08:00 via iPhone   1
    restful != path variable
    YUyu101
        6
    YUyu101  
       2021-04-08 23:42:00 +08:00 via Android
    /p/2/s/10 哪里好看了,分页不就是查询条件吗,放在参数里很正常啊,换个说法不就是 limit skip 吗,get 查询条件嫌长还可以放 body 里,反正 es 是这么做的。
    dzdh
        7
    dzdh  
       2021-04-08 23:58:48 +08:00   1
    首先查询条件放到 request body 并没有任何不合适

    其次,直接 querystring 非常合适。or ?filter=jsonstring&limit=xx&offset=xx
    chinvo
        8
    chinvo  
       2021-04-09 00:05:01 +08:00 via iPhone   1
    rest 不是不用 query string.

    我习惯 ?before=xxx&size=xxx
    Kobayashi
        9
    Kobayashi  
       2021-04-09 00:23:25 +08:00 via Android
    你不对劲
    rationa1cuzz
        10
    rationa1cuzz  
       2021-04-09 09:31:05 +08:00   1
    个人喜欢明显第一个好,清晰、明了一看就知道是啥意思,恕我直言,第二种我看的好蠢
    aleung
        11
    aleung  
       2021-04-09 10:07:05 +08:00 via Android
    根据定义,query string 就是放查询条件的,前面部分标识的是资源。如果你把不属于资源标识的过滤条件放进去,反而不符合 REST 了。
    unco020511
        12
    unco020511  
       2021-04-09 10:16:46 +08:00
    path variable 应该是 id 之类的资源标示,所以你的参数应该按照是否属于资源标示这样的标准来区分放在 path variable 还是 querystring,另外按照 frc 的建议,get 携带 requestbody 应该是不太合理的(但不是禁止).以上个人见解不一定对
    jiaweilee
        13
    jiaweilee  
       2021-04-09 12:15:33 +08:00 via Android
    第二种怎么看都很蠢啊
    jotpot
        14
    jotpot  
       2021-04-09 13:04:00 +08:00
    感觉不要太纠结了,3 楼正解
    dddd1919
        15
    dddd1919  
       2021-04-09 13:32:57 +08:00   1
    首先要理解 restful 的核心:resource,不是所有东西都是 resource,就像分页和查询条件
    另外,也没说不让加参数啊
    xkeyideal
        16
    xkeyideal  
       2021-04-09 17:24:54 +08:00
    2C 页面用第二种呢可能会优雅有点,但你这种参数太多了说真的也难看。
    内部系统呢,那么第一种绝对是简单高效的,优点如下:
    1. 不会出现后续需求迭代时出现路由冲突
    2. 对前端来说传参简单明了,对后端维护起来也简单,可读性强,
    3. 约束性强,key value 明确,不会出现传参出错,debug 半天后发现传参错位的 zz 行为
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5139 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 01:22 PVG 09:22 LAX 17:22 JFK 20:22
    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