V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
catsky
V2EX  ›  程序员

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

  •  
  •   catsky ·
    catsky · 2013-07-31 15:38:40 +08:00 · 6739 次点击
    这是一个创建于 4168 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在设计一个网站的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 条回复    1970-01-01 08:00:00 +08:00
    binux
        1
    binux  
       2013-07-31 15:42:24 +08:00
    同名的参数表达的是数组
    name = [ken, kerry, Chris]
    然后该怎么用,自己考虑
    jasontse
        2
    jasontse  
       2013-07-31 15:44:29 +08:00 via iPad
    提高请求数有利于新浪收费 :D
    justfindu
        3
    justfindu  
       2013-07-31 16:24:31 +08:00
    你传三个name 也只会接收到最后一个呀~ 有和区别~

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

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

    所以一个参数更加醒目.
    leofml
        4
    leofml  
       2013-07-31 17:35:52 +08:00
    express的话, 对于第一个api, req.body.name = [ken, kerry, Chris]

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

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

    Base64之前的JSON:

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

    这样可行不?
    zorceta
        18
    zorceta  
       2013-08-01 10:48:14 +08:00
    @catsky 随手写的>_<
    逗号可能更好看
    zorceta
        19
    zorceta  
       2013-08-01 10:49:00 +08:00
    @catsky 另外&&是C里的and
    undeadking
        20
    undeadking  
       2013-08-01 11:03:59 +08:00
    REST强调资源,你这样设计,user就不算资源了.
    以复数的用户作为资源的话,post,put和delete对应的操作也是批量化的,这样的场景很少
    Narcissu5
        21
    Narcissu5  
       2013-08-01 12:37:53 +08:00
    试下OData的filter
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2799 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 07:49 · PVG 15:49 · LAX 23:49 · JFK 02:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.