没有值的MediaWiki URL参数

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

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

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

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

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

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

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

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

他们最有可能只是检查参数是否已定义。 通过向查询字符串添加redirects ,有效地说“重定向变量为真”。 因此,添加redirects=0仍然定义该变量,MediaWiki API注意到它已定义(不关心值是什么)。

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

只要问这个问题并从别人那里得到一些反馈,我就会进一步挖掘。

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

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

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

但是,由于查询组件通常用于携带“key = value”对forms的标识信息,而一个常用值是对另一个URI的引用,因此有时可以更好地避免对这些字符进行百分比编码。

正如您所看到的,没有任何关于键的值的存在与否。

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

  • 机票#8653“JQUERY.PARAM OUTPUTS”NULL“和”未定义“在QUERY STRING中”
  • 票#11329“.PARAM()应该返回空值且不明确的”

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

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

这当然有一些意义,但对于MediaWiki的情况,这在bug报告/function请求中没有提到,这根本没有帮助:

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

回报

            

总结一下:

标准没有定义应该在这里做什么,而是将其留给实现。 MediaWiki API做了一件事,jQuery最初忽略了它,然后当它被指出时,做了不同的事情。 双方似乎并没有意识到彼此。

规范中的差距导致了不相容的解释……但它们并不难解决。

好吧,如果你在python或ruby或其他东西做一个小测试webserver并请求一个带有查询字符串的url的?something ,通常你会看到params以something=nil (或类似)的forms出现。

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