Pourquoi le constructeur d'URL n'encode-t-il pas les crochets dans la chaîne de requête ?
<p>En JavaScript, le constructeur <code>URL</code> n'encode pas les crochets et les parenthèses lorsqu'ils apparaissent dans une chaîne de requête, tandis que <code>encodeURI</code> code> les codera toujours. Cela me rend confus car la plupart des sources disent d'utiliser <code>encodeURI</code>/<code>encodeURIComponent</code> pour encoder lorsque vous incluez des caractères spéciaux dans les paramètres de requête. Je m'attendais à un comportement similaire pour l'objet <code>URL</code> </p>
<p>Cela me pose des problèmes pour écrire des tests unitaires car je ne sais pas comment les paramètres de requête de l'objet URL seront codés. Existe-t-il une spécification qui l'indique, ou dois-je toujours encoder les paramètres avant d'utiliser le constructeur <code>URL</code> Merci pour votre aide. </p>
<heure />
<p>Exemple illustrant un objet URL qui n'encode pas les crochets dans la chaîne de requête</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}
≪/pré>
<p>Si j'utilise <code>encodeURI</code>, la seule différence est que les crochets sont codés</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
≪/pré>
<heure />
<p>Remarque : Si les parenthèses ne figurent pas dans les paramètres de requête, l'objet URL les encodera. </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>