【问题标题】:Boolean in a URI query?URI 查询中的布尔值?
【发布时间】:2011-09-21 15:28:35
【问题描述】:

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

【问题讨论】:

  • URI 规范(现在是 RFC 3986)根本不在乎。
  • 我会说做最简单的事情 - 即如果你在 java 中,Boolean.parseBoolean("true")...

标签: http url uri


【解决方案1】:

Url 是字符串,并且 URL 中的所有值都是字符串, 所有参数都将作为字符串返回。

查看此链接了解更多详情 https://stackoverflow.com/a/29740218/12800206

【讨论】:

    【解决方案2】:

    ?foo 等布尔参数使用键存在

    例如,使用?foo 而不是?foo=true

    我更喜欢这种方式,因为我不需要浪费时间去思考或追踪源代码是否应该是true1enableyes 或任何超出我想象的东西。

    在区分大小写的情况下,应该是true还是True还是TRUE

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

    恕我直言,?foo 的形式是将布尔变量传递给服务器的最优雅的方式,因为它只有 2 种状态(存在或不存在),这很适合表示布尔变量。

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

    GET _cat/master?v
    

    【讨论】:

      【解决方案3】:

      我使用自定义函数来管理它。

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

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

      【讨论】:

        【解决方案4】:

        或者你可以这样做

        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;
        }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 请注意 express-query-boolean 将递归解析所有参数并将任何“类似布尔”的输入强制为布尔值。
          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-10-27
            • 1970-01-01
            • 1970-01-01
            • 2014-12-22
            • 1970-01-01
            • 1970-01-01
            • 2017-09-18
            相关资源
            最近更新 更多