Menu

JavaScript URL ve URLSearchParams Kullanımı

JavaScript'te URL ve URLSearchParams API'leri ile URL parse etme, query string okuma ve parametre ekleme — regex'e gerek kalmadan, encoding derdi çekmeden.

URL'leri String Hileleriyle Parse Etmeyi Bırakın

URL API'si hayatımıza girmeden önce insanlar URL'leri split('?'), regex ve biraz da şansla parçalara ayırıyordu. Değerin içinde bir &, =, boşluk ya da ASCII dışı bir karakter çıkana kadar da iş görüyordu — ondan sonrası felaket. Oysa hem tarayıcıda hem de Node'da düzgün bir parser hazır geliyor. Onu kullanın.

index.js
Output
Click Run to see the output here.

Tek bir çağrıyla URL'in tüm parçaları ayrıştırılıp düzgünce decode edilmiş halde elinize geliyor. Geçersiz girdi verdiğinizde constructor bir TypeError fırlatır — ki genelde istediğiniz de budur: bozuk bir URL, sessizce ileriye bozuk veri taşımak yerine yüksek sesle patlamalıdır.

Query Parametrelerini Okumak

Her URL nesnesinin bir .searchParams özelliği vardır — query string'i okuyup yazmayı bilen bir URLSearchParams nesnesi:

index.js
Output
Click Run to see the output here.

Dikkat etmeniz gereken birkaç nokta var:

  • Değerler size decode edilmiş halde döner. ?name=Ada%20Lovelace size "Ada Lovelace" verir.
  • Her şey string'tir. "2", 2 değildir. Sayıya ihtiyacınız varsa Number() ile dönüştürün.
  • Aynı key'i birden fazla kullanmak geçerlidir. get ilk eşleşmeyi, getAll ise tüm eşleşmeleri döner.
  • Olmayan key'ler undefined değil null döner — yani ?? "default" ile güzel çalışır.

JavaScript ile Query String Oluşturma

Query string'i sıfırdan URLSearchParams ile oluşturabilirsiniz — elle escape etmeye ya da & ile birleştirmeye gerek yok:

index.js
Output
Click Run to see the output here.

Ya da bir nesneden oluşturabilirsin — [anahtar, değer] çiftlerinden oluşan herhangi bir iterable işe yarar, düz bir nesne de kullanılabilir:

index.js
Output
Click Run to see the output here.

set ile append arasındaki fark: set, o anahtara ait mevcut değeri ezip yerine yenisini yazar. append ise aynı anahtarla bir değer daha ekler. Bir anahtarın birden fazla kez bulunması mantıklıysa (etiketler, filtreler gibi) append kullan; tek değer taşıyan parametrelerde ise set tercih edilmeli.

URL'yi güncelleme

URL canlı bir nesne olduğu için searchParams üzerinde yaptığın değişiklikler .search ve .href alanlarına otomatik olarak yansır:

index.js
Output
Click Run to see the output here.

Bu, mevcut bir URL'ye query parametresi eklemenin en doğru yolu. "URL'de zaten ? var mı?" diye kontrol etmeye ya da başına & mi ? mi koyacağım diye kafa yormaya gerek yok.

URL'nin diğer kısımlarını da aynı mantıkla değiştirebilirsiniz:

index.js
Output
Click Run to see the output here.

Parametreler Üzerinde Döngü Kurmak

URLSearchParams iterable'dır, yani üzerinde döngü kurabilirsin. for...of ile sana [key, value] çiftleri döner; ayrıca alışık olduğumuz keys(), values() ve entries() yardımcıları da mevcut:

index.js
Output
Click Run to see the output here.

Dikkat et: tekrar eden anahtarlar birden fazla kez görünür — yani tag = web ve ardından tag = beginner ayrı ayrı yer alır. Bu, query string'in gerçek hâline birebir uyuyor.

Hızlı bir debug çıktısı için düz bir nesneye ihtiyacın varsa Object.fromEntries işini görür, ama tekrar eden anahtarları ezer; yalnızca sonuncu değeri tutar:

index.js
Output
Click Run to see the output here.

Hata ayıklama için iş görür. Ama tekrar eden bir anahtar olabiliyorsa yanlış yoldasınız.

Göreceli URL'lerde Taban Adres Şart

Tek başına new URL("/search?q=js") yazarsanız hata alırsınız — göreceli bir yol, başlı başına geçerli bir URL değildir. İkinci argüman olarak bir taban adres geçmeniz gerekir:

index.js
Output
Click Run to see the output here.

Buradaki çözümleme kuralları, tarayıcıların <a href> için kullandığı kurallarla aynı: başında / varsa host'a göre mutlak yol, slash yoksa mevcut yola göreceli, .. ise bir üst dizine çıkarır. Yapılandırılmış bir base URL'den API adresleri oluştururken epey işinize yarar.

Tarayıcı tarafında window.location.href, mevcut sayfanın URL'sini parse etmek için hazır bir base olarak kullanılabilir:

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

Geçersiz URL'lerle Başa Çıkmak

URL constructor, hatalı biçimdeki girdilerde hata fırlatır. Bu aslında işinize yarar — ama kullanıcıdan ya da dış bir sistemden gelen herhangi bir şeyi parse ederken try/catch kullanmanız gerektiği anlamına gelir:

index.js
Output
Click Run to see the output here.

Modern ortamlarda ayrıca URL.canParse(input) diye bir yöntem var — sadece doğrulama yapmak istediğinizde try/catch zahmetine girmeden boolean olarak sonuç dönen pratik bir kontrol:

index.js
Output
Click Run to see the output here.

Küçük Bir Çalışan Örnek

Şimdi hepsini birleştirelim: Bir URL'deki mevcut filtreleri okuyalım, üzerinde oynayalım ve yönlendirme yapmak için yeni bir URL üretelim:

index.js
Output
Click Run to see the output here.

null geçersen parametre silinir. Başka bir değer verirsen parametre set edilir ya da üzerine yazılır. Filtre arayüzleri, sayfalama ya da deep link kurarken bir şekilde hep bu kalıbı yazıyor olacaksın.

Akılda Kalması Gerekenler

  • new URL(string) bir URL'i etiketli parçalara ayırır. Saçma bir değer verirsen hata fırlatır.
  • url.searchParams bir URLSearchParams nesnesidir — get, getAll, set, append, delete, has metotlarını kullan.
  • Encoding işini senin yerine hallediyor. Elle string kurmadığın sürece encodeURIComponent'e uzanma.
  • Göreli yolları çözümlemek için ikinci argüman olarak bir temel URL geçebilirsin.
  • Güvenilmeyen girdileri doğrulamak için URL.canParse (ya da try/catch) tam sana göre.

Ne zaman bir URL'i .split('?') ile parçalamak veya query parametresini regex ile çekmek aklına gelirse, onun yerine bu API'lere uzan. Hem daha kısalar, hem doğru çalışıyorlar, hem de zaten runtime'ın içinde hazır duruyorlar.

Sıkça Sorulan Sorular

JavaScript'te bir URL nasıl parse edilir?

String'i doğrudan URL constructor'ına veriyorsunuz: const u = new URL('https://example.com/path?x=1'). Dönen nesnede protocol, host, pathname, search, hash ve searchParams gibi alanlar hazır olarak geliyor. Geçersiz bir URL verilirse hata fırlatır, bu yüzden dışarıdan gelen veriyle çalışırken try/catch içine almakta fayda var.

JavaScript'te query string parametresi nasıl alınır?

url.searchParams.get('name') ile. Decode edilmiş değeri döndürür, parametre yoksa null verir. Aynı isimde birden fazla geçen parametreler için (?tag=a&tag=b gibi) searchParams.getAll('tag') kullanın; tüm değerleri dizi olarak alırsınız.

URL ile URLSearchParams arasındaki fark nedir?

URL tüm URL'yi temsil eder — protokol, host, path, query ve hash. URLSearchParams ise sadece query string kısmıyla ilgilenir; a=1&b=2 tarzı string'leri tek başına oluşturmak veya parse etmek için kullanabilirsiniz. Ayrıca her URL nesnesinin, kendisine bağlı bir URLSearchParams döndüren .searchParams property'si vardır.

Query parametrelerini manuel encode etmem gerekir mi?

Gerekmez. URLSearchParams; set, append çağrılarında ve string'e çevirirken key ve value'ları otomatik olarak encode eder. Boşluk, &, = ve Unicode karakterler doğru şekilde işlenir. encodeURIComponent'a ancak string'i elle birleştiriyorsanız ihtiyaç duyarsınız — ki bunu zaten yapmamanız lazım.

Coddy ile kodlamayı öğren

BAŞLA