链接到MediaWiki URL参数没有价值(MediaWiki URL parameters wi

2019-06-25 14:02发布

所述query一个的一部分URL似乎由通过分隔的键-值对的&并通过相关联=

我已经采取总是使用jQuery的$.param()函数,因为我觉得它使我的代码更具可读性和可维护性,以URL编码,我的查询字符串。

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

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

注意部分&redirects ,这没有值。

jQuery的$.param()需要一个对象,因为对象只包括键值对是不可能的传递对象,其中一个成员都有一个键,但没有价值。

这很好,所以我认为我可以在这样的传递一些值nullundefined0但似乎所有的这些都是一样的对待。 我觉得这是令人惊讶的,我一直无法找出任何MediaWiki的API文档中关于这背后的原因。

OK,很容易通过手动构建URL字符串的工作在我的情况各地。 我的问题是“这是MediaWiki的API的怪癖?还是在URL编码的设计怪癖?我应该在哪里看的懂的背后有没有相关的值URL编码参数的原因何在呢?

Answer 1:

最有可能的是什么,他们正在做的是刚刚检查的参数定义。 通过将redirects到查询字符串,实际上是说“重定向变量是真”。 所以,增加redirects=0仍然限定可变的,并且MediaWiki的API被指出的是,它被定义(不关心的值是什么)。

jQuery代码将只需要追加该参数(任意值,或没有值)或忽略它,如果你不希望它被明确限定。



Answer 2:

只是问这个问题,并得到了一些反馈,从他人促使我进一步深入研究过。

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

  • 场值对每个分离用等号。 如果该值是空字符串的等号可以被省略。

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

然而,如查询组件经常被用来携带在“键=值”对与一个频繁使用的值的形式识别信息是到另一个URI的引用,它有时可用性更好地避免percent-编码那些字符。

正如你所看到的,在存在或不存在值的键没有。

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

  • 票务#8653“JQUERY.PARAM输出‘空’与‘未定义’在查询字符串”
  • 票务#11329“.PARAM()应该返回null和undefined空值”

提出了各种建议由覆盖是否转换param: nullparam: undefinedparamparam=

在结束了一个修补程序包括jQuery的,1.8的下一个版本,它转换都nullundefinedparam= -空字符串。

这使得某种当然的感觉,但对于链接到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的最初忽视了它,那么当有人指出,做不同的事情。 双方似乎并没有意识到对方。

在规范中的一个缺口,导致相互抵触的解释......但他们并不难解决。



Answer 3:

好吧,如果您在Python或Ruby或东西有点测试Web服务器并请求的查询字符串像一个网址?something ,通常你会看到PARAMS进来的something=nil (或类似)。

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



文章来源: MediaWiki URL parameters without values