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 | Örnek | Anlamı |
|---|---|---|
| scheme | https | Protokol (http/https/ftp/file) |
| userInfo | ada | Kimlik bilgisi (nadiren) |
| host | www.site.com | Sunucu adı/IP |
| port | 8443 | Kapı numarası (yoksa varsayılan: http=80, https=443) |
| path | /urunler/ara | Sunucudaki kaynak yolu |
| query | kategori=java&sayfa=2 | Parametreler (? sonrası, & ile ayrılır) |
| fragment | sonuclar | Sayfa 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:
URIbir kaynağı tanımlar/ayrıştırır;URLona nasıl erişileceğini de içerir (bağlantı açabilir). Modern Java'danew URL(String)constructor'ı deprecated'tır (Java 20+); ayrıştırma içinURI, bağlantı içinuri.toURL()veyaHttpClienttercih 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ılabilir1// 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}Ornek2
çalıştırılabilir1// 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}Ornek3
çalıştırılabilir1// 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}