第 2 课
查询参数模型
理解重复键、空值、flag、数组以及不同框架的差异。
查询字符串看起来像简单的键值对,但不同框架会用不同模型解释它。
?tag=api&tag=json&draft=&preview
解析器可能看到:
tag有两个值draft是空字符串preview是 flag,或是空值
重复键
查询字符串允许重复键:
?tag=frontend&tag=backend
有些框架保留最后一个值,有些会收集成数组,有些要求使用 tag[] 这样的命名约定。
空值与 flag
这些写法在不同系统中不一定等价:
?debug
?debug=
?debug=true
如果服务端把“出现了”视为 true,?debug 可能就够了。如果它期待布尔字符串,就可能必须写 debug=true。
顺序
普通过滤场景下,参数顺序通常不重要。但对签名和缓存键来说,顺序可能非常重要。签名 URL 往往要求固定排序和精确的百分号编码。
更安全的心智模型
不要假设解析和重建查询字符串一定无害。你需要明确应用如何处理:
- 重复键
- 空字符串
- 缺失值
- 数组语法
- 排序
- 空格与加号的编码
规则明确后,URL bug 才更容易复现。