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

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

我在设计一个网站的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的设计规范吗?

请各位不吝指教。多谢!


请求三个name参数 可以考虑 or
name(多个用逗号隔开)

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

用逗号或用其他符合隔开


你可以看看URI Template规范,其中Section3有专门的例子说明


你可以参考一下jquery的方法

$.getJSON("/",{name:[11,22,33,44]})

这样的话请求的URL就成了

/?name%5B%5D=11&name%5B%5D=22&name%5B%5D=33&name%5B%5D=44

在chrome的debug工具中,就是这样

name[]:11
name[]:22
name[]:33
name[]:44

在服务端中可以解析为原始的,起码在cakephp中可以,其它的我没试过

{name:[11,22,33,44]}

原生php简单的直接使用三个name是不可以的,不过同时传递三个name参数倒是可以。详细参见CoddIgniter文档:http://codeigniter.org.cn/user_guide/general/controllers.html#passinguri

原生php使用$_GET['name']函数接受url里传递的"name=xxx"的信息。name不能重名,所以不行。 【注】:我没说 name[],是楼上说的,天地良心啊!我是认真答题的啊,为什么踩我啊==

sinaapp这样设计是因为那是用easy同学的lazyphp做的...easy同学还开源了lazyrest。 easy同学很懒,lazyphp框架基本就是组织了一下路由。他中午吃完饭都不跟我们去散步的:)


我支持你传 N 个同名参数,只要 API 的实现者没有异议。不过我还是推荐使用 name=tom,jack,joy 这种逗号分隔的值。一是可以省一些字节,二是看着习惯。

至于在 URL 里拿路径分隔符分隔多个值的我反对,因为它和路径的语义冲突了。

【热门文章】
【热门文章】