V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
RiceMarch
V2EX  ›  问与答

RESTful 分页查询 API 如何设计?

  •  1
     
  •   RiceMarch · Apr 8, 2021 · 3710 views
    This topic created in 1849 days ago, the information mentioned may be changed or developed.

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

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

    其次,直接 querystring 非常合适。or ?filter=jsonstring&limit=xx&offset=xx
    chinvo
        8
    chinvo  
       Apr 9, 2021 via iPhone   ❤️ 1
    rest 不是不用 query string.

    我习惯 ?before=xxx&size=xxx
    Kobayashi
        9
    Kobayashi  
       Apr 9, 2021 via Android
    你不对劲
    rationa1cuzz
        10
    rationa1cuzz  
       Apr 9, 2021   ❤️ 1
    个人喜欢明显第一个好,清晰、明了一看就知道是啥意思,恕我直言,第二种我看的好蠢
    aleung
        11
    aleung  
       Apr 9, 2021 via Android
    根据定义,query string 就是放查询条件的,前面部分标识的是资源。如果你把不属于资源标识的过滤条件放进去,反而不符合 REST 了。
    unco020511
        12
    unco020511  
       Apr 9, 2021
    path variable 应该是 id 之类的资源标示,所以你的参数应该按照是否属于资源标示这样的标准来区分放在 path variable 还是 querystring,另外按照 frc 的建议,get 携带 requestbody 应该是不太合理的(但不是禁止).以上个人见解不一定对
    jiaweilee
        13
    jiaweilee  
       Apr 9, 2021 via Android
    第二种怎么看都很蠢啊
    jotpot
        14
    jotpot  
       Apr 9, 2021
    感觉不要太纠结了,3 楼正解
    dddd1919
        15
    dddd1919  
       Apr 9, 2021   ❤️ 1
    首先要理解 restful 的核心:resource,不是所有东西都是 resource,就像分页和查询条件
    另外,也没说不让加参数啊
    xkeyideal
        16
    xkeyideal  
       Apr 9, 2021
    2C 页面用第二种呢可能会优雅有点,但你这种参数太多了说真的也难看。
    内部系统呢,那么第一种绝对是简单高效的,优点如下:
    1. 不会出现后续需求迭代时出现路由冲突
    2. 对前端来说传参简单明了,对后端维护起来也简单,可读性强,
    3. 约束性强,key value 明确,不会出现传参出错,debug 半天后发现传参错位的 zz 行为
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2447 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 03:35 · PVG 11:35 · LAX 20:35 · JFK 23:35
    ♥ Do have faith in what you're doing.