设计REST API: 一个REST api里面传递多个同名参数合理吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
catsky

设计REST API: 一个REST api里面传递多个同名参数合理吗

  •  
  •   catsky
    catsky Jul 31, 2013 7261 views
    This topic created in 4652 days ago, the information mentioned may be changed or developed.
    在设计一个网站的REST API,碰到一个问题,想听听大家的意见,多谢。

    比如:一个用来获取用户信息的REST api

    http://www.mydomain.com/users?name=ken&name=kerry&name=Chris

    这样,传递三个name参数,可以只调用一次,就可以获取这三个用户的信息。但是我看了很多网站暴露的REST API, 如sinaapp,weixin 等,对于此类的REST API, 只允许提供一个name参数,如果需要这三个用户的信息,需要调用三次
    http://www.mydomain.com/users?name=ken
    http://www.mydomain.com/users?name=kerry
    http://www.mydomain.com/users?name=Chris

    我觉得这样这样效率有点低,但sinaapp等为什么会这样设计呢? 这是REST api的设计规范吗?

    请各位不吝指教。多谢!
    21 replies    1970-01-01 08:00:00 +08:00
    binux
        1
    binux  
       Jul 31, 2013
    同名的参数表达的是数组
    name = [ken, kerry, Chris]
    然后该怎么用,自己考虑
    jasontse
        2
    jasontse  
       Jul 31, 2013 via iPad
    提高请求数有利于新浪收费 :D
    justfindu
        3
    justfindu  
       Jul 31, 2013
    你传三个name 也只会接收到最后一个呀~ 有和区别~

    微信 新浪等没有太大需求来请求list类型的

    还有如果是传递三个参数只调用一次, 数据库操作消耗和单个的应该没多少区别~ 无非是 or 和 in 吧

    所以一个参数更加醒目.
    leofml
        4
    leofml  
       Jul 31, 2013
    express的话, 对于第一个api, req.body.name = [ken, kerry, Chris]

    我猜是框架问题
    davepkxxx
        5
    davepkxxx  
       Jul 31, 2013
    普通的数组而已,没有什么合理不合理的。
    BeijingBaby
        6
    BeijingBaby  
       Jul 31, 2013
    @justfindu 可以接收到多个值。
    whuhacker
        7
    whuhacker  
       Jul 31, 2013
    我觉得你应该用 ?search=
    sharpnk
        8
    sharpnk  
       Jul 31, 2013
    http://www.mydomain.com/users?name=ken&name=kerry&name=Chris
    这样,传递三个name参数,可以只调用一次,就可以获取这三个用户的信息。

    ?? how? 你三个参数的名字都一样, 服务器端能读到的应该只有ken或者是chris. 读到哪一个取决于框架的设计.
    catsky
        10
    catsky  
    OP
       Jul 31, 2013
    @zorceta name=ken&&kerry&&chris 这样的话,在服务器端获取参数 name的值ken&&kerry&&chris, 然后代码split这个string? 用&&是应该规范?还是用其他的连接符也可以,比如逗号?name=ken,kerry,chris
    hourui
        11
    hourui  
       Jul 31, 2013
    http://www.mydomain.com/users?name=ken,kerry,Chris
    为何不这样写
    或者找一个特殊的分隔符做分割不就好了?
    whuhacker
        12
    whuhacker  
       Jul 31, 2013
    同意逗号,见过这样用的
    RobinFai
        14
    RobinFai  
       Aug 1, 2013
    http://www.mydomain.com/users?name[]=ken&name[]=kerry&name[]=Chris
    btw,数组不是这样传的?
    justfindu
        15
    justfindu  
       Aug 1, 2013
    @BeijingBaby 我知道可以多值~ 但是没有 name=***&name=***&name=*** 这样传值吧~ 但是理论上也是可以获取~ 使用query模式获取uri~ 但是这样不觉得很反常么~
    duhastmich
        16
    duhastmich  
       Aug 1, 2013
    @leofml get请求没有body的吧, 因该是req.param('name')
    不过标准的应该是 name[]=foo&name[]=bar, name=foo&name=bar 解析应该是express 额外做的吧, 可能也有其他框架这么做, 这样name 是string 还是 array..
    还是逗号分隔比较好看
    soli
        17
    soli  
       Aug 1, 2013
    http://www.mydomain.com/users?params=Base64过的JSON

    Base64之前的JSON:

    {
    "name":["xxx","yyy","zzz"],
    "other":"xxoo"
    }

    这样可行不?
    zorceta
        18
    zorceta  
      &bsp;Aug 1, 2013
    @catsky 随手写的>_<
    逗号可能更好看
    zorceta
        19
    zorceta  
       Aug 1, 2013
    @catsky 另外&&是C里的and
    undeadking
        20
    undeadking  
       Aug 1, 2013
    REST强调资源,你这样设计,user就不算资源了.
    以复数的用户作为资源的话,post,put和delete对应的操作也是批量化的,这样的场景很少
    Narcissu5
        21
    Narcissu5  
       Aug 1, 2013
    试下OData的filter
    About     Help     Advertise     Blog     API     FAQ     Solana     3606 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 68ms UTC 04:43 PVG 12:43 LAX 21:43 JFK 00:43
    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