我在设计一个网站的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 里拿路径分隔符分隔多个值的我反对,因为它和路径的语义冲突了。