Warum kodiert der URL-Konstruktor keine Klammern in der Abfragezeichenfolge?
P粉287254588
2023-09-03 21:05:00
<p>In JavaScript kodiert der <code>URL</code> Klammern und Klammern nicht, wenn sie in einer Abfragezeichenfolge erscheinen, während <code>encodeURI</code> oder <code>encodeURIComponent</ code> wird sie immer kodieren. Das verwirrt mich, weil die meisten Quellen sagen, dass man <code>encodeURI</code>/<code>encodeURIComponent</code> zum Codieren verwenden soll, wenn man Sonderzeichen in Abfrageparameter einfügt. Ich habe ein ähnliches Verhalten für das Objekt <code>URL</code> erwartet. </p>
<p>Dadurch habe ich Probleme beim Schreiben von Unit-Tests, da ich nicht weiß, wie die Abfrageparameter des URL-Objekts codiert werden. Gibt es eine Spezifikation, die dies besagt, oder sollte ich Parameter immer codieren, bevor ich den <code>URL</code>-Konstruktor verwende? Ich danke Ihnen für Ihre Hilfe. </p>
<hr />
<p>Beispiel, das zeigt, dass ein URL-Objekt Klammern in der Abfragezeichenfolge nicht kodiert</p>
<pre class="brush:js;toolbar:false;">const href = (new URL('https://foobar.com?myQuery={"@asdf/asdf":"1234"}' )).href;
// ^ https://foobar.com/?myQuery={%22@asdf/asdf%22:%221234%22}
</pre>
<p>Wenn ich <code>encodeURI</code> verwende, besteht der einzige Unterschied darin, dass die Klammern codiert sind</p>
<pre class="brush:js;toolbar:false;">const href = encodeURI('https://foobar.com?myQuery={"@asdf/asdf":"1234"}');
// ^ https://foobar.com?myQuery=%7B%22@asdf/asdf%22:%221234%22%7D
</pre>
<hr />
<p>Hinweis: Wenn die Klammern nicht in den Abfrageparametern enthalten sind, werden sie vom URL-Objekt codiert. </p>
<pre class="brush:js;toolbar:false;">const href = (new URL('https://foobar.com/}}}?myQuery={"@asdf/asdf":" 1234"}')).href;
// ^ https://foobar.com/%7D%7D%7D?myQuery={%22@asdf/asdf%22:%221234%22}
</pre></p>
有多种可能的编码方式,它们都应该被解释为相同的URL,因此从技术上讲都不是错误的。另一个例子是百分比编码可以使用大写或小写字符(
%aa
或%AA
),域名不区分大小写,空格可以被编码为+
或%20
(在某些部分)。如果您想对特定的URL编码实现进行单元测试,可以进行字符串匹配,但如果您想知道两个URL是否相同,无论它们是如何编码的,您首先需要进行一步称为“规范化”的操作,然后再进行比较。