URI 查询中的布尔值?

问题描述 投票:0回答:6

在 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的查询组件部分,它没有指定如何表达布尔参数。那么我想知道的是常见(或合理)的方法是什么?

http url uri
6个回答
34
投票

这完全取决于您读取查询字符串的方式。您要求的所有这些都是有效的。


31
投票

使用布尔参数的键存在性,例如
?foo

例如,使用

?foo
代替
?foo=true

我更喜欢这种方式,因为我不需要浪费时间思考或追踪源代码是否应该是

true
1
enable
yes
或任何超出我想象的东西。

区分大小写的情况下,应该是

true
还是
True
还是
TRUE

在词干提取的情况下,应该是

enable
还是
enabled

恕我直言,

?foo
的形式是将布尔变量传递到服务器的最优雅的方式,因为它只有两种状态(存在或不存在),这对于表示布尔变量很有用。

这也是 Elasticsearch 对布尔查询参数的实现方式,例如:

GET _cat/master?v

8
投票

在具有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 } } 

3
投票

Url 是字符串,URL 中的所有值都是字符串, 所有参数都将以字符串形式返回。

这取决于您如何在代码中解释它。

对于最后一个,

c = true

你可以做一个

JSON.parse(c)

这会将其更改为布尔值。

另外,你必须小心不要传递一个空字符串,否则会抛出错误。


1
投票

我用自定义函数来管理这个。

在此处查看浏览器兼容性: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;
  }, {});
}

该函数返回一个包含所有已解析查询参数的对象,并默认回退到原始值。


0
投票

或者你也可以这样做

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.