没有值的MediaWiki URL参数

hip*_*ail 7 jquery key-value url-parameters wikipedia-api mediawiki-api

a的query一部分URL似乎由分隔&和关联的键值对组成=.

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

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

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

请注意该部分&redirects,它没有任何价值.

jQuery $.param()采用一个对象,因为对象只包含键值对,所以不可能传递一个成员有一个键但没有值的对象.

这很好,所以我假设我可以传递一些值,例如null或者undefined或者0似乎所有这些都被视为相似.我发现这令人惊讶,我无法在MediaWiki API文档中发现有关此背后的原因的任何内容.

好吧,通过手动构建URL字符串,我可以很容易地解决这个问题.我的问题是"这是MediaWiki API中的一个怪癖吗?或者是URL编码设计中的一个怪癖?我应该阅读哪些内容来理解没有相关值的URL编码参数背后的原因?

Qua*_*cal 7

最有可能他们正在做的只是检查参数是否已定义.通过添加redirects到查询字符串,有效地说"重定向变量为真".因此,增加redirects=0仍然定义变量,以及MediaWiki的API被指出的是,它被定义(不关心的值是什么).

您的jQuery代码只需要附加该参数(带有任何值,或没有值),或者如果您不希望它被定义,则省略它.


hip*_*ail 3

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

维基百科的“查询字符串”页面在“Web 表单”部分中说道:

  • 每个字段值对都用等号分隔。如果值为空字符串,则可以省略等号。

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

然而,由于查询组件通常用于以“键=值”对的形式携带标识信息,并且一个经常使用的值是对另一个 URI 的引用,因此有时避免对这些字符进行百分比编码会更好地提高可用性。

正如您所看到的,与键值的存在或不存在无关。

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

param: null就是否将和转换param: undefinedparam或提出了各种建议param=

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

这当然有一定道理,但对于 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>
Run Code Online (Sandbox Code Playgroud)

总结:

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

规范中的缺陷导致了不兼容的解释……但解决它们并不难。