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

2013-07-31 15:38:40 +08:00
 catsky
在设计一个网站的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的设计规范吗?

请各位不吝指教。多谢!
6716 次点击
所在节点    程序员
21 条回复
binux
2013-07-31 15:42:24 +08:00
同名的参数表达的是数组
name = [ken, kerry, Chris]
然后该怎么用,自己考虑
jasontse
2013-07-31 15:44:29 +08:00
提高请求数有利于新浪收费 :D
justfindu
2013-07-31 16:24:31 +08:00
你传三个name 也只会接收到最后一个呀~ 有和区别~

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

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

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

我猜是框架问题
davepkxxx
2013-07-31 17:51:49 +08:00
普通的数组而已,没有什么合理不合理的。
BeijingBaby
2013-07-31 17:55:58 +08:00
@justfindu 可以接收到多个值。
whuhacker
2013-07-31 19:16:35 +08:00
我觉得你应该用 ?search=
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
2013-07-31 21:20:30 +08:00
catsky
2013-07-31 21:44:55 +08:00
@zorceta name=ken&&kerry&&chris 这样的话,在服务器端获取参数 name的值ken&&kerry&&chris, 然后代码split这个string? 用&&是应该规范?还是用其他的连接符也可以,比如逗号?name=ken,kerry,chris
hourui
2013-07-31 22:09:48 +08:00
http://www.mydomain.com/users?name=ken,kerry,Chris
为何不这样写
或者找一个特殊的分隔符做分割不就好了?
whuhacker
2013-07-31 22:39:48 +08:00
同意逗号,见过这样用的
pright
2013-07-31 22:40:48 +08:00
RobinFai
2013-08-01 08:59:23 +08:00
http://www.mydomain.com/users?name[]=ken&name[]=kerry&name[]=Chris
btw,数组不是这样传的?
justfindu
2013-08-01 09:05:47 +08:00
@BeijingBaby 我知道可以多值~ 但是没有 name=***&name=***&name=*** 这样传值吧~ 但是理论上也是可以获取~ 使用query模式获取uri~ 但是这样不觉得很反常么~
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
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
2013-08-01 10:48:14 +08:00
@catsky 随手写的>_<
逗号可能更好看
zorceta
2013-08-01 10:49:00 +08:00
@catsky 另外&&是C里的and
undeadking
2013-08-01 11:03:59 +08:00
REST强调资源,你这样设计,user就不算资源了.
以复数的用户作为资源的话,post,put和delete对应的操作也是批量化的,这样的场景很少

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77550

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX