query
的{{1}}部分似乎由URL
分隔并由&
关联的键值对组成。
我总是使用jQuery的=
函数来对我的查询字符串进行URL编码,因为我发现它使我的代码更具可读性和可维护性。
在过去的几天里,我发现自己正在调用MediaWiki API,但在使用硬编码URL清理我的工作原型以使用$.param()
时,我注意到一些MediaWiki API包含带键而不是值的查询参数!< / p>
注意 $.param()
部分,它没有任何价值。
jQuery的&redirects
接受一个对象,因为对象只包含键值对,所以无法传递一个成员有一个键但没有值的对象。
这很好,所以我假设我可以传递一些值,例如$.param()
或null
或undefined
,但看起来所有这些都是相同的。我发现这令人惊讶,而且我无法发现in the MediaWiki API documentation关于这背后的原因的任何内容。
通过手动构建URL字符串,可以很容易地解决这个问题。我的问题是“这是MediaWiki API中的怪癖吗?或者是URL编码设计中的一个怪癖?我应该在哪里阅读以理解没有关联值的URL编码参数背后的原因?
答案 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: null
和param: undefined
转换为param
或param=
。
最后,jQuery的下一个版本1.8中包含了一个修复程序,它将null
和undefined
转换为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 } )
并且它不会检查值,因为它不需要它。或者,只需通过附加正确的字符串自己构建它。