没有值的MediaWiki URL参数
URL
的query
部分似乎由以&
分隔的键值对组成,并由=
关联。
我总是使用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编码参数背后的原因?
他们最有可能只是检查参数是否已定义。 通过向查询字符串添加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: null
和param: undefined
转换为param
或param=
。
最后,为jQuery,1.8的下一个版本提供了一个修复程序,它将null
和undefined
都转换为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 } )
并且它根本不会检查值,因为它不需要一。 或者通过附加正确的字符串来自己构建它。