Menu

URL dan Query String JavaScript: URL dan URLSearchParams

Cara mem-parse, menyusun, dan mengubah URL di JavaScript dengan API URL dan URLSearchParams, tanpa regex dan tanpa bug kasus tepi.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Berhenti mem-parse URL dengan trik string

Sebelum API URL ada, orang memotong URL dengan split('?'), regex, dan harapan. Biasanya berhasil, sampai sebuah nilai berisi &, =, spasi, atau karakter non-ASCII, dan saat itu gagal. Browser dan Node sama-sama menyediakan parser yang layak. Pakailah.

Satu pemanggilan, dan setiap bagian URL sudah terpisah dan ter-decode dengan benar. Constructor-nya melempar TypeError pada input yang tidak valid, dan biasanya memang itulah yang kamu mau: URL sampah sebaiknya gagal dengan jelas daripada diam-diam menghasilkan sampah di tahap berikutnya.

Membaca parameter query

Setiap URL punya property .searchParams, yaitu object URLSearchParams yang tahu cara membaca dan menulis query string:

Beberapa hal yang perlu diperhatikan:

  • Nilai yang kembali sudah di-decode. ?name=Ada%20Lovelace memberimu "Ada Lovelace".
  • Semuanya berupa string. "2" bukan 2. Konversi dengan Number() kalau kamu butuh angka.
  • Key yang berulang itu sah. get mengembalikan kecocokan pertama; getAll mengembalikan setiap kecocokan.
  • Key yang tidak ada mengembalikan null, bukan undefined, jadi ?? "default" cocok dipakai bersamanya.

Menyusun query string

Kamu bisa menyusun query string dari nol dengan URLSearchParams, tanpa escape manual, tanpa menggabungkan dengan &:

Atau buat dari sebuah object: iterable apa pun berisi pasangan [key, value] bisa dipakai, begitu juga object biasa:

set vs append: set mengganti nilai yang sudah ada untuk key itu. append menambahkan satu lagi. Pakai append saat sebuah key memang boleh berulang (tag, filter); pakai set untuk parameter bernilai tunggal.

Mengubah URL

Karena URL adalah object yang hidup, mengubah searchParams otomatis memperbarui .search dan .href:

Inilah cara idiomatis menambahkan parameter query ke URL yang sudah ada. Tanpa pengecekan "apakah URL-nya sudah punya ?", tanpa pusing apakah harus mengawali dengan & atau ?.

Kamu bisa mengubah bagian lain dari URL dengan cara yang sama:

Menelusuri parameter

URLSearchParams bersifat iterable. for...of memberimu pasangan [key, value], dan ada juga helper yang biasa: keys(), values(), dan entries():

Perhatikan bahwa key yang berulang muncul beberapa kali: kamu akan melihat tag = web lalu tag = beginner sebagai entri terpisah. Itu sesuai dengan query string yang sebenarnya.

Kalau kamu ingin object biasa untuk print debug cepat, Object.fromEntries bisa dipakai, tapi ia meringkas key yang berulang dan hanya menyimpan nilai terakhir:

Tidak masalah untuk debugging. Salah kalau ada key yang bisa berulang.

URL relatif butuh base

new URL("/search?q=js") saja akan melempar error: path relatif bukan URL yang valid kalau berdiri sendiri. Kirim base sebagai argumen kedua:

Aturan resolusinya sama dengan yang dipakai browser untuk <a href>: / di awal berarti absolut dari host, tanpa garis miring berarti relatif terhadap path saat ini, .. naik satu tingkat. Sangat praktis saat kamu menyusun URL API dari base yang sudah dikonfigurasi.

Di browser, window.location.href adalah base siap pakai untuk mem-parse URL halaman saat ini:

const u = new URL(window.location.href);
const page = u.searchParams.get("page") ?? "1";

Menangani URL yang tidak valid

Constructor URL melempar error pada input yang rusak. Itu berguna, tapi artinya kamu butuh try/catch saat mem-parse apa pun yang diketik pengguna atau dikirim sistem luar:

Lingkungan modern juga menyediakan URL.canParse(input), pengecekan boolean yang tidak perlu repot dengan try/catch saat kamu hanya ingin memvalidasi:

Contoh kecil yang berfungsi

Menyatukan semuanya: baca filter saat ini dari sebuah URL, ubah, lalu hasilkan URL baru untuk dituju:

Mengirim null menghapus parameternya. Nilai lain mengisi atau menimpanya. Pola ini akan kamu tulis dalam satu bentuk atau lainnya setiap kali kamu membuat UI filter, pagination, atau deep link.

Yang perlu kamu ingat

  • new URL(string) mem-parse URL menjadi bagian-bagian berlabel. Ia melempar error pada input sampah.
  • url.searchParams adalah URLSearchParams: pakai get, getAll, set, append, delete, has.
  • Encoding dilakukan untukmu. Jangan pakai encodeURIComponent kecuali kamu menyusun string secara manual.
  • Kirim URL base sebagai argumen kedua untuk me-resolve path relatif.
  • URL.canParse (atau try/catch) adalah alat validasimu untuk input yang tidak bisa dipercaya.

Setiap kali kamu tergoda memotong URL dengan .split('?') atau mengambil parameter query dengan regex, pakai API ini saja. Lebih pendek, benar, dan sudah tersedia di runtime.

Pertanyaan yang sering diajukan

Bagaimana cara mem-parse URL di JavaScript?

Kirim string-nya ke constructor URL: const u = new URL('https://example.com/path?x=1'). Object hasilnya menyediakan protocol, host, pathname, search, hash, dan helper searchParams. Constructor ini melempar error pada URL yang tidak valid, jadi bungkus dengan try/catch saat mem-parse input yang tidak bisa dipercaya.

Bagaimana cara mengambil parameter query string di JavaScript?

Pakai url.searchParams.get('name'). Ia mengembalikan nilai yang sudah di-decode, atau null kalau parameternya tidak ada. Untuk parameter yang bisa berulang (?tag=a&tag=b), pakai searchParams.getAll('tag') untuk mendapat semua nilainya sebagai array.

Apa bedanya URL dan URLSearchParams?

URL mem-parse dan mewakili URL secara utuh: protocol, host, path, query, hash. URLSearchParams hanya bagian query string-nya, dan kamu bisa memakainya sendiri untuk menyusun atau mem-parse string a=1&b=2. Setiap instance URL punya property .searchParams berupa URLSearchParams yang terikat ke URL itu.

Apakah aku perlu meng-encode parameter query secara manual?

Tidak. URLSearchParams meng-encode key dan nilai secara otomatis saat kamu memanggil set, append, atau membaca kembali string-nya. Spasi, &, =, dan Unicode ditangani dengan benar. Pakai encodeURIComponent hanya saat kamu menyusun string secara manual, yang biasanya tidak perlu kamu lakukan.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai