问题描述
在路由设计中,参数可以以query和params两种形式存在url中。通常,我们会将分页、搜索等信息放在query里;而点击进如某个列表项目的详情页时,会把项目id以params的形式放在url中。但是,当列表的层次特别深,出现列表详情又是个列表,点击详情双是个列表,再点详情叒是个列表……这种情况下,url的设计就值得研究一番了。
笔者在研究了一阵RESTful API后,又写了篇关于RESTful API的一些思考与疑问,与本主题相关性较强,可作为拓展阅读。
场景
公司列表->部门列表->员工列表->员工详细
要支持面包屑(公司名 / 部门名 / 员工名)
公司列表 | 部门列表 | 员工列表 | 员工详情 | 说明 | |
---|---|---|---|---|---|
params风格1 | /corps/ | /corps/111/ | /corps/111/222/ | /corps/111/222/333/ | 依次罗列id |
params风格2 | /corps/ | /corps/111/ | /111/departs/222/ | /111/222/users/333/ | 最后一定是/items/item_id格式 |
params风格3 | /corps/ | /corps/111/ | /corps/111/departs/222/ | /corps/111/departs/222/users/333/ | 严格保持restful格式 |
query风格 | /corps/ | /departs/?corp=111 | /users/?corp=111&depart=222 | /detail/?corp=111&depart=222&user=333 | 从url直接看出意思,query依次罗列 |
混合风格 | /corps/ | /corps/111/ | /departs/222/?corp=111 | /users/333/?corp=111&depart=222 | 最后是/items/item_id格式,缺失信息用query补 |
个人倾向【query风格】和【混合风格】
搜索或分页
另外,列表通常都会有搜索和分页功能,会将多个搜索的key及value也放到url上。这个场景,毫无疑问是选择query方案的。但是,结合场景1来看,如果都放到query里,且值比较多时,就显得比较乱了。所以我们还需要另外的策略来对query的格式进行一下约束。
伪代码(记得用encodeURIComponent编码):
?searchkey=JSON.stringify({userid:9527,corp:222})&info=JSON.stringify({corp:111,depart:222,user:333})
这样就比较方便取参数,而且不同类型的参数隔离开了。不过!!url会变得更长,更难看!鱼和熊掌不可得兼啊。。。
总结
关键问题就两个
- url要存有全部信息
- 不同类型信息尽量隔离