没有值的MediaWiki URL参数

时间:2012-06-18 17:43:16

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

query的{​​{1}}部分似乎由URL分隔并由&关联的键值对组成。

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

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

  

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

注意 $.param() 部分,它没有任何价值。

jQuery的&redirects接受一个对象,因为对象只包含键值对,所以无法传递一个成员有一个键但没有值的对象。

这很好,所以我假设我可以传递一些值,例如$.param()nullundefined,但看起来所有这些都是相同的。我发现这令人惊讶,而且我无法发现in the MediaWiki API documentation关于这背后的原因的任何内容。

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 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的情况,这在bug报告/功能请求中没有提到,这根本没有用处:

  

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最初忽略了它,然后当它被指出时,做了不同的事情。双方似乎并没有意识到彼此。

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

答案 2 :(得分:0)

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

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