7

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

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

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

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

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

jQuery$.param()接受一个对象,并且由于对象仅由键值对组成,因此不可能传递一个成员具有键但没有值的对象。

没关系,所以我认为我可以传递一些值,例如nullor undefined0但似乎所有这些都被同等对待。我发现这令人惊讶,并且我无法在 MediaWiki API 文档中发现任何有关其背后原因的内容。

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

4

3 回答 3

7

他们所做的很可能只是检查参数是否已定义。通过添加redirects到查询字符串中,这实际上是在说“重定向变量为真”。因此,添加redirects=0仍在定义该变量,MediaWiki API 注意到它已定义(不关心值是什么)。

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

于 2012-06-18T17:47:00.593 回答
3

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

Wikipedia 的“Web forms”部分中的“Query string”页面说:

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

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

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

如您所见,没有任何关于键值的存在或不存在。

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

提出了各种建议,涉及是否转换为param: null和或。param: undefinedparamparam=

最后,jQuery 的下一个版本 1.8 包含了一个修复程序,它将两者都转换nullundefined-param=空字符串。

这当然有某种意义,但是对于错误报告/功能请求中未提及的 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>

总结一下:

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

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

于 2012-06-18T19:16:54.050 回答
0

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

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

于 2012-06-18T17:47:47.830 回答