【问题标题】:MediaWiki URL parameters without values没有值的 MediaWiki URL 参数
【发布时间】:2012-06-20 17:42:26
【问题描述】:

URLquery 部分似乎由由 & 分隔并由 = 关联的键值对组成。

我一直使用 jQuery 的 $.param() 函数对我的查询字符串进行 URL 编码,因为我发现它使我的代码更具可读性和可维护性。

在过去的几天里,我发现自己在调用 MediaWiki API,但是在使用硬编码 URL 清理我的工作原型以使用 $.param() 时,我注意到一些 MediaWiki API 包含带有键但不包含值的查询参数!

api.php ? action=query & titles=Main%20page & redirects

注意 &redirects 部分,它没有任何价值。

jQuery 的$.param() 接受一个对象,由于对象仅由键值对组成,因此不可能传递一个成员有键但没有值的对象。

这很好,所以我认为我可以传递一些值,例如 nullundefined0 但似乎所有这些都被同等对待。我觉得这很令人惊讶,我一直无法发现任何 in the MediaWiki API documentation 背后的原因。

好的,在我的情况下,通过手动构建 URL 字符串很容易解决。我的问题是 “这是 MediaWiki API 中的一个怪癖吗?还是 URL 编码设计中的一个怪癖? 我应该从哪里阅读以了解没有关联值的 URL 编码参数背后的原因?

【问题讨论】:

  • 如果不阅读文档,我会假设这只是意味着 redirects 被视为具有 true 值的 boolean,就像在大多数语言中你可以写if(redirects) 而不是if(redirects==true)
  • 是的,我假设是一样的,我只是想知道这样做有多常见,以及这种可能性源自哪里,因为 URL 构建工具显然忽略了这种做法。

标签: jquery key-value url-parameters wikipedia-api mediawiki-api


【解决方案1】:

他们所做的很可能只是检查参数是否已定义。通过将redirects 添加到查询字符串中,这实际上是在说“重定向变量为真”。因此,添加 redirects=0 仍然是定义该变量,MediaWiki API 注意到它已定义(不关心值是什么)。

您的 jQuery 代码只需附加该参数(带任何值或不带值),如果您不想定义它,则将其省略。

【讨论】:

    【解决方案2】:

    好吧,如果你用 python 或 ruby​​ 或其他东西做一个小测试网络服务器,并请求一个带有查询字符串的 URL,如 ?something,通常你会看到参数以 something=nil(或类似)的形式出现。

    MediaWiki 是用 PHP 编写的,因此处理方式可能略有不同,但在我看来,您应该安全地执行 $.params( { redirects: null } ),并且它根本不会检查值,因为它不需要。或者只是通过附加正确的字符串自己构建它。

    【讨论】:

    • 是的,解决这个问题真的很容易,但我总是喜欢真正了解事物,所以我想知道为什么会这样(-:确实,如果我总是想要 URL 中的&redirects,我可以传递任何值,包括null。但是对于那些想要重定向或不基于某些变量或逻辑的人来说,这里有一个小问题。例如,在 jQuery 中设计 MediaWiki 库的人必须知道在没有标准的 jQuery URL 构建函数。
    • $.param( $.extend( obj, shouldRedirect ? { redirects: true } : {} ) ) 会删掉它。我认为这里的重点是 MediaWiki 做错了,当没有指定参数时,依赖默认的 null 或 undefined 值作为规范的一部分。同样x=&y=1 也是有效的。
    【解决方案3】:

    只是问了这个问题并从其他人那里得到了一些反馈,这促使我也进一步挖掘。

    Wikipedia's "Query string" page in the section "Web forms" 说:

    • 字段-值对均由等号分隔。如果值为空字符串,则可以省略等号。

    查询字符串是在section 3.4 of RFC 3986中定义的,但实际上键值对并不是标准的一部分,只是简单提及:

    但是,作为查询组件 通常用于携带识别信息的形式 “key=value”对,一个常用的值是对 另一个 URI,有时最好避免使用百分比- 编码这些字符。

    如您所见,没有任何关于键值存在或不存在的信息。

    至于 jQuery,事实证明在过去 15 个月内已经提交了两份关于此行为的错误报告/功能请求:

    提出了各种建议,涉及是否将param: nullparam: undefined 转换为paramparam=

    最后,jQuery 的下一个版本 1.8 包含了一个修复程序,它将 nullundefined 转换为 param= - 空字符串。

    这当然有某种意义,但对于错误报告/功能请求中未提及的 MediaWiki 的情况,这根本没有帮助:

    http://en.wikipedia.org/w/api.php?action=query&titles=Main%20page&redirects=

    返回

    <?xml version="1.0"?>
    <api>
      <query>
        <redirects>
          <r from="Main page" to="Main Page" />
        </redirects>
        <pages>
          <page pageid="15580374" ns="0" title="Main Page" />
        </pages>
      </query>
    </api>
    

    总结一下:

    标准没有定义这里应该做什么,而是由实现来决定。 MediaWiki API 做了一件事,jQuery 最初忽略了它,然后当它被指出时,做了另一件事。两方似乎并不了解对方。

    规范中的一个漏洞导致了不兼容的解释......但它们并不难解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 2017-06-27
      • 2016-03-05
      • 2023-04-06
      相关资源
      最近更新 更多