Eğitim Portalı/Java/URL ve URL İşlemleri
Java01-java/32-url-islemleri

URL ve URL İşlemleri

Soket programlamada ham TCP/UDP kanallarıyla çalıştık. Ama web dünyasında kaynaklara genelde adresleriyle (URL) erişiriz: https://site.com/urunler?kategori=java. Java, bu adresleri ayrıştırmak, parçalarına ayırmak, gü…

URL ve URL İşlemleri

Soket programlamada ham TCP/UDP kanallarıyla çalıştık. Ama web dünyasında kaynaklara genelde adresleriyle (URL) erişiriz: https://site.com/urunler?kategori=java. Java, bu adresleri ayrıştırmak, parçalarına ayırmak, güvenli biçimde kodlamak ve göreli adresleri çözmek için zengin araçlar sunar (java.net.URI ve URL). Bu bölümde adreslerle çalışmayı; bir sonraki bölümde ise bu adreslere bağlanıp veri alıp vermeyi göreceğiz.

URL'in anatomisi

Bir URL birkaç parçadan oluşur:

<scheme>://<userInfo>@<host>:<port><path>?<query>#<fragment>
https://ada@www.site.com:8443/urunler/ara?kategori=java&sayfa=2#sonuclar
ParçaÖrnekAnlamı
schemehttpsProtokol (http/https/ftp/file)
userInfoadaKimlik bilgisi (nadiren)
hostwww.site.comSunucu adı/IP
port8443Kapı numarası (yoksa varsayılan: http=80, https=443)
path/urunler/araSunucudaki kaynak yolu
querykategori=java&sayfa=2Parametreler (? sonrası, & ile ayrılır)
fragmentsonuclarSayfa içi konum (# sonrası)

Java'da bunu ayrıştırmak için URI kullanılır:

URI uri = URI.create("https://www.site.com:8443/ara?kategori=java#sonuclar");
uri.getScheme(); uri.getHost(); uri.getPort(); uri.getPath(); uri.getQuery(); uri.getFragment();

Örnek 1 (./Ornek1.java) tam donanımlı bir URL'i parçalarına ayırır.

URI vs URL: URI bir kaynağı tanımlar/ayrıştırır; URL ona nasıl erişileceğini de içerir (bağlantı açabilir). Modern Java'da new URL(String) constructor'ı deprecated'tır (Java 20+); ayrıştırma için URI, bağlantı için uri.toURL() veya HttpClient tercih edilir.

URL kodlama (encoding)

URL'de yalnızca belirli karakterler güvenlidir. Boşluk, Türkçe harfler (ç, ü, ı...), &, =, ?, # gibi karakterler özeldir; doğrudan konursa URL bozulur veya yanlış ayrıştırılır. Çözüm yüzde kodlamasıdır (%XX): URLEncoder kodlar, URLDecoder çözer:

URLEncoder.encode("java & spring", StandardCharsets.UTF_8); // "java+%26+spring"
URLDecoder.decode(kodlu, StandardCharsets.UTF_8);

Örnek 2 (./Ornek2.java) özel karakterli bir aramayı kodlar/çözer, bir Map'ten güvenli bir sorgu string'i inşa eder ve geri ayrıştırır. Kural: sorgu parametrelerini her zaman kodla — özellikle kullanıcı girdisinden geliyorsa.

Göreli URL'ler: resolve, relativize, normalize

Web sayfalarındaki linkler genelde görelidir (sayfa.html, ../resimler/). Bir temel adrese göre bunları tam URL'e çevirmek resolve ile yapılır — tarayıcıların linkleri çözmesi gibi:

URI temel = URI.create("https://site.com/docs/java/");
temel.resolve("giris.html");   // https://site.com/docs/java/giris.html
temel.resolve("../spring/");   // https://site.com/docs/spring/
temel.resolve("/iletisim");    // https://site.com/iletisim  (kökten)
  • relativize: İki mutlak URL arasındaki göreli yolu bulur (resolve'un tersi).
  • normalize: Yoldaki . ve .. parçalarını sadeleştirir.

Örnek 3 (./Ornek3.java) bunları gösterir. Bu işlemler web tarayıcıları, HTML link çözümleme, sitemap üretimi ve API istemcilerinde sık kullanılır.

Özet

URL'in parçalarını (URI ile ayrıştırma), URL kodlamayı (URLEncoder/URLDecoder ile güvenli sorgu parametreleri) ve göreli URL işlemlerini (resolve/relativize/normalize) öğrendik; URI ve URL ayrımına ve new URL(String)'in neden artık önerilmediğine değindik. Adresleri artık güvenle ele alabiliyorsun. Sırada bu adreslere bağlanıp veri alıp vermek var: URLConnection ve HttpURLConnection (ve modern HttpClient).

Kod Örnekleri(3)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: Bir URL'in parçaları — URI ile ayrıştırma (protokol, host, port, yol, sorgu, fragment).
2// (URI ayrıştırma için modern, önerilen tiptir; new URL(String) Java 20+ ile deprecated'tır.)
3// Çalıştırma: java Ornek1.java
4import java.net.URI;
5
6public class Ornek1 {
7
8    public static void main(String[] args) {
9        // Tam donanımlı bir URL'i ayrıştıralım.
10        URI uri = URI.create("https://ada:gizli@www.site.com:8443/urunler/ara?kategori=java&sayfa=2#sonuclar");
11
12        System.out.println("Tam URL   : " + uri);
13        System.out.println("scheme    : " + uri.getScheme());     // https (protokol)
14        System.out.println("userInfo  : " + uri.getUserInfo());   // ada:gizli (kimlik)
15        System.out.println("host      : " + uri.getHost());       // www.site.com
16        System.out.println("port      : " + uri.getPort());       // 8443
17        System.out.println("path      : " + uri.getPath());       // /urunler/ara
18        System.out.println("query     : " + uri.getQuery());      // kategori=java&sayfa=2
19        System.out.println("fragment  : " + uri.getFragment());   // sonuclar
20
21        // Port belirtilmezse -1 döner (varsayılan port: http=80, https=443 kullanılır).
22        URI uri2 = URI.create("http://ornek.com/sayfa");
23        System.out.println("\nPort yoksa: " + uri2.getPort() + "  (varsayılan: http=80)");
24
25        // URI vs URL: URI bir KAYNAĞI tanımlar/ayrıştırır; URL ona NASIL erişileceğini de içerir.
26        // Bağlantı açmak için: uri.toURL() (sonraki konuda kullanacağız).
27        System.out.println("\nURI -> URL'e çevrilebilir mi? " + (uri.isAbsolute()));
28
29        System.out.println("""
30
31                --- URL'in parçaları ---
32                <scheme>://<userInfo>@<host>:<port><path>?<query>#<fragment>
33                Örnek: https://www.site.com:8443/urunler/ara?kategori=java#sonuclar
34                scheme=protokol (http/https/ftp), host=sunucu, port=kapı, path=kaynak yolu,
35                query=parametreler (?a=1&b=2), fragment=sayfa içi konum (#).
36                URI ayrıştırma için; URL ise erişim (bağlantı açma) için kullanılır.""");
37    }
38}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: URL kodlama (encoding) — özel karakterleri ve sorgu parametrelerini güvenli taşımak.
2// Çalıştırma: java Ornek2.java
3import java.net.URLDecoder;
4import java.net.URLEncoder;
5import java.nio.charset.StandardCharsets;
6import java.util.LinkedHashMap;
7import java.util.Map;
8import java.util.stream.Collectors;
9
10public class Ornek2 {
11
12    public static void main(String[] args) {
13        // URL'de boşluk, Türkçe karakter, &, = gibi karakterler özeldir; KODLANMALIDIR.
14        String aramaMetni = "spring boot & güvenlik";
15        String kodlu = URLEncoder.encode(aramaMetni, StandardCharsets.UTF_8);
16        System.out.println("Ham   : " + aramaMetni);
17        System.out.println("Kodlu : " + kodlu);                       // boşluk->+, ç/ü/&->%XX
18        System.out.println("Çözülmüş: " + URLDecoder.decode(kodlu, StandardCharsets.UTF_8));
19
20        // Sorgu (query) string'i parametrelerden güvenle inşa etmek:
21        Map<String, String> parametreler = new LinkedHashMap<>();
22        parametreler.put("kategori", "eğitim");
23        parametreler.put("arama", "java & spring");
24        parametreler.put("sayfa", "2");
25
26        String query = parametreler.entrySet().stream()
27                .map(e -> URLEncoder.encode(e.getKey(), StandardCharsets.UTF_8)
28                        + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8))
29                .collect(Collectors.joining("&"));
30        System.out.println("\nİnşa edilen sorgu: ?" + query);
31
32        // Tam URL:
33        String tamUrl = "https://site.com/ara?" + query;
34        System.out.println("Tam URL: " + tamUrl);
35
36        // Geri ayrıştırma: query string -> Map
37        System.out.println("\nSorguyu ayrıştır:");
38        ayristir(query).forEach((k, v) -> System.out.println("  " + k + " = " + v));
39
40        System.out.println("""
41
42                --- Neden URL kodlama? ---
43                URL'de yalnızca belirli karakterler güvenlidir. Boşluk, Türkçe harf, &, =, ? gibi
44                karakterler '%XX' (yüzde kodlaması) ile temsil edilir; aksi halde URL bozulur/yanlış
45                ayrıştırılır. URLEncoder kodlar, URLDecoder çözer. Sorgu parametrelerini HER ZAMAN kodla.""");
46    }
47
48    static Map<String, String> ayristir(String query) {
49        Map<String, String> sonuc = new LinkedHashMap<>();
50        for (String parca : query.split("&")) {
51            String[] kv = parca.split("=", 2);
52            sonuc.put(URLDecoder.decode(kv[0], StandardCharsets.UTF_8),
53                    kv.length > 1 ? URLDecoder.decode(kv[1], StandardCharsets.UTF_8) : "");
54        }
55        return sonuc;
56    }
57}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek3

çalıştırılabilir
Ornek3.java
1// Ornek3: Göreli (relative) URL'ler — resolve ve relativize.
2// Bir temel adrese göre göreli yolları tam URL'e çevirmek (ve tersi).
3// Çalıştırma: java Ornek3.java
4import java.net.URI;
5
6public class Ornek3 {
7
8    public static void main(String[] args) {
9        URI temel = URI.create("https://site.com/docs/java/");
10
11        // resolve: temel + göreli yol -> tam (mutlak) URL. (HTML'deki <a href="...">, tarayıcı gezinti)
12        System.out.println("Temel: " + temel);
13        System.out.println("resolve('giris.html')     -> " + temel.resolve("giris.html"));
14        System.out.println("resolve('../spring/')     -> " + temel.resolve("../spring/"));
15        System.out.println("resolve('/iletisim')      -> " + temel.resolve("/iletisim"));      // kökten
16        System.out.println("resolve('https://x.com/y') -> " + temel.resolve("https://x.com/y")); // mutlak -> aynen
17
18        // relativize: iki mutlak URL arasındaki göreli yolu bul (resolve'un tersi).
19        URI hedef = URI.create("https://site.com/docs/java/giris.html");
20        System.out.println("\nrelativize: " + temel.relativize(hedef) + "  (temele göre göreli yol)");
21
22        // normalize: '.' ve '..' içeren yolu sadeleştir.
23        URI karisik = URI.create("https://site.com/a/b/../c/./d");
24        System.out.println("normalize('/a/b/../c/./d') -> " + karisik.normalize());
25
26        System.out.println("""
27
28                --- Göreli URL'ler ---
29                resolve(göreli): temel adrese göre tam URL üretir — tarayıcıların linkleri çözmesi gibi.
30                  'sayfa.html' -> aynı dizinde; '../x' -> üst dizin; '/x' -> kökten; 'http://...' -> aynen.
31                relativize(mutlak): iki adres arasındaki göreli yolu bulur (resolve'un tersi).
32                normalize(): yoldaki '.' ve '..' parçalarını sadeleştirir.
33                Bu işlemler; web tarayıcıları, HTML link çözümleme ve API istemcilerinde sık kullanılır.""");
34    }
35}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.