Mengapakah pembina URL tidak mengekod kurungan dalam rentetan pertanyaan?
P粉287254588
2023-09-03 21:05:00
<p>Dalam JavaScript, pembina <code>URL</code> tidak mengekodkan kurungan dan kurungan apabila ia muncul dalam rentetan pertanyaan, manakala <code>encodeURI</code> atau <code>encodeURIComponent< kod> akan sentiasa mengekodnya. Ini mengelirukan saya kerana kebanyakan sumber mengatakan untuk menggunakan <code>encodeURI</code>/<code>encodeURIComponent</code> untuk mengekod apabila anda memasukkan aksara khas dalam parameter pertanyaan. Saya menjangkakan kelakuan serupa untuk objek <code>URL</code> </p>
<p>Ini menyebabkan saya menghadapi masalah menulis ujian unit kerana saya tidak tahu bagaimana parameter pertanyaan objek URL akan dikodkan. Adakah terdapat spesifikasi yang menyatakan ini, atau patutkah saya sentiasa mengekod parameter sebelum menggunakan <code>URL</code> terima kasih atas bantuan anda. </p>
<hr />
<p>Contoh menunjukkan objek URL bukan pengekodan kurungan dalam rentetan pertanyaan</p>
<pre class="brush:js;toolbar:false;">const href = (URL baharu('https://foobar.com?myQuery={"@asdf/asdf":"1234"}' )).href;
// ^ https://foobar.com/?myQuery={%22@asdf/asdf%22:%221234%22}
</pra>
<p>Jika saya menggunakan <code>encodeURI</code>, satu-satunya perbezaan ialah kurungan dikodkan</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
</pra>
<hr />
<p>Nota: Jika kurungan tidak disertakan dalam parameter pertanyaan, objek URL akan mengekodnya. </p>
<pre class="brush:js;toolbar:false;">const href = (URL baharu('https://foobar.com/}}}?myQuery={"@asdf/asdf":" 1234"}')).href;
// ^ https://foobar.com/%7D%7D%7D?myQuery={%22@asdf/asdf%22:%221234%22}
</pra></p>
Terdapat berbilang pengekodan yang mungkin, semuanya harus ditafsirkan sebagai URL yang sama, jadi tidak ada yang salah secara teknikal. Contoh lain ialah pengekodan peratus boleh menggunakan aksara besar atau huruf kecil (
%aa
或%AA
),域名不区分大小写,空格可以被编码为+
或%20
(dalam beberapa bahagian).Jika anda ingin menguji unit pelaksanaan khusus pengekodan URL, anda boleh melakukan pemadanan rentetan, tetapi jika anda ingin tahu sama ada dua URL adalah sama tanpa mengira cara ia dikodkan, anda perlu melakukan langkah yang dipanggil "pengkanonikal" dahulu. , dan kemudian bandingkan.