在 URI 的查询部分指定布尔值的首选方式是什么?正常的查询字符串看起来像
a=foo&b=bar
假设我有一个带有布尔值的参数“c”,我应该声明吗
a=foo&b=bar&c=1
或者
a=foo&b=bar&c=True
或者
a=foo&b=bar&c=true
我检查了RFC 2396的查询组件部分,它没有指定如何表达布尔参数。那么我想知道的是常见(或合理)的方法是什么?
这完全取决于您读取查询字符串的方式。您要求的所有这些都是有效的。
?foo
例如,使用
?foo
代替 ?foo=true
。
我更喜欢这种方式,因为我不需要浪费时间思考或追踪源代码是否应该是
true
或1
或enable
或yes
或任何超出我想象的东西。
区分大小写的情况下,应该是
true
还是True
还是TRUE
?
在词干提取的情况下,应该是
enable
还是enabled
?
恕我直言,
?foo
的形式是将布尔变量传递到服务器的最优雅的方式,因为它只有两种状态(存在或不存在),这对于表示布尔变量很有用。
这也是 Elasticsearch 对布尔查询参数的实现方式,例如:
GET _cat/master?v
在具有express服务器的节点中,您可以添加布尔解析器中间件,例如express-query-boolean。
var boolParser = require('express-query-boolean');
// [...]
app.use(bodyParser.json());
app.use(boolParser());
没有
// ?a=true&b[c]=false
console.log(req.query);
// => { a: 'true', b: { c: 'false' } }
与
// ?a=true&b[c]=false
console.log(req.query);
// => { a: true, b: { c: false } }
Url 是字符串,URL 中的所有值都是字符串, 所有参数都将以字符串形式返回。
这取决于您如何在代码中解释它。
对于最后一个,
c = true
你可以做一个
JSON.parse(c)
这会将其更改为布尔值。
另外,你必须小心不要传递一个空字符串,否则会抛出错误。
我用自定义函数来管理这个。
在此处查看浏览器兼容性:https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
function parseQuery(url = window.location.search) {
const urlParams = new URLSearchParams(url);
return Array.from(urlParams.keys()).reduce((acc, key) => {
const value = urlParams.get(key);
if (value) {
switch (value) {
case 'false': {
acc[key] = false;
break;
}
case 'true': {
acc[key] = true;
break;
}
case 'undefined': {
acc[key] = undefined;
break;
}
case 'null': {
acc[key] = null;
break;
}
default: {
acc[key] = value;
}
}
}
return acc;
}, {});
}
该函数返回一个包含所有已解析查询参数的对象,并默认回退到原始值。
或者你也可以这样做
const queryBool = unwrapTextBoolean({{{A_WAY_TO_GET_THAT_TEXT_BOOLEAN}}})
if(queryBool===null) {return;}
if(queryBool){
/*true-based code*/
}else{
/*false-based code*/
}
function unwrapTextBoolean(tB){
if(tB === 'true') return true;
if(tb === 'false') return false;
return null;
}