Gyakorlati alapok III.
Az URL és műveletei
A Uniform Resource Locator egy olyan univerzális hivatkozás, amely egy, az Interneten elérhető erőforrásra mutat. Az URL 2 fő komponensből áll:
-
Protokollazonositó (Protocol identifier),
-
Erőforrás neve (Resource name).
Elemezzük ki például Java-oktatási honlapom egyik URL-jét:
Figyelem! Ez az erőforrás nem létezik!
http://informatika-programozas.hu/teszt.html#LETOLTES
-
http:// - az erőforrás ezen a protokollon keresztül érhető el,
-
informatika-programozas.hu/teszt.html – az erőforrás lokációja a domain név alatt, a szerveren belül,
-
#LETOLTES – az úgynevezett horgony hivatkozás (#) a HTML-nyelvben lehetőséget ad arra, hogy fejezeten belül további részeket, erőforrásokat érjünk el.
A fentieket le tudjuk ellenőrizni futtatható Java-kóddal is. Az összes, hálózattal kapcsolatos Java-rutin meglepetésszerűen a java.net csomagban található. Így van lehetőségünk többek között URL-t, mint önálló objektumot is létrehozni és felhasználni, valamint a Java-rendszer az objektumhoz további, specifikus, nagyon hasznos metódusokat is rendelkezésre bocsát. Az alábbi Java-kód önmagáért beszél, hiszen a felhasznált metódusok az URL fent ismertetett alapvizsgálatát végzik el:
import java.net.*;
public class Main {
public static void main(String[] args) throws Exception {
URL url = new
URL("http://informatika-programozas.hu:80/teszt.html#LETOLTES");
System.out.println("protocol = " + url.getProtocol());
System.out.println("host = " + url.getHost());
System.out.println("filename = " + url.getFile());
System.out.println("port = " + url.getPort());
System.out.println("ref = " + url.getRef());
}
}
Végeredmény:
protocol = http
host = informatika-programozas.hu
filename = /teszt.html
port = 80
ref = LETOLTES
A fenti kódban észrevehetjük a portszámot, amely HTTP-protokoll esetén mindig 80. Külön kiírása akár el is hagyható, ekkor azonban – mivel nem lesz megállapítható portszám-, a getPort() függvény -1 visszatérési értéket ad vissza:
import java.net.*;
public class Main {
public static void main(String[] args) throws Exception {
URL url = new
URL("http://informatika-programozas.hu/teszt.html#LETOLTES");
System.out.println("protocol = " + url.getProtocol());
System.out.println("host = " + url.getHost());
System.out.println("filename = " + url.getFile());
System.out.println("port = " + url.getPort());
System.out.println("ref = " + url.getRef());
}
}
Végeredmény:
protocol = http
host = informatika-programozas.hu
filename = /teszt.html
port = -1
ref = LETOLTES
A következő kérdés, hogy mi történik abban az esetben, ha rossz az URL?
Ekkor valójában egy jól előrelátható hibára számítunk. A helyzet ismerős lehet, hiszen pontosan erre való a kivételkezelés. Rossz URL esetén MalformedURLException nevű kivétel fog keletkezni, amelyet lehetőségünk van try-catch blokk-kal lekezelni.
Az alábbi kódban szándékosan pontatlan URL-t adunk meg (htp),
de a hibát elkapjuk és a catch ágban
hibaüzenettel lekezeljük:
import java.net.*;
public class Main {
public static void main(String[] args) throws Exception {
boolean joURL = true;
try {
URL url = new
URL("htp://informatika-programozas.hu:80/teszt.html#LETOLTES");
}
catch (MalformedURLException
e) {
System.out.println("Rossz URL!");
joURL = false;
}
if(joURL) {
System.out.println("Jó URL!");
}
}
}
Végeredmény:
Rossz URL!
Érdemes kísérleteznünk a fenti kóddal, miszerint kivételkezelésnél a Java alkotói milyen hibákat definiáltak. Például kivétel keletkezik az alábbi esetekben (ha minden más jó):
-
htp://informatika-programozas.hu:80/teszt.html#LETOLTES
-
http//informatika-programozas.hu:80/teszt.html#LETOLTES
Viszont jó például:
-
http:informatika-programozas.hu:80/teszt.html#LETOLTES
-
http:informatika-programozas.hu/teszt.html#LETOLTES
Érdekesség:
-
http://informatika-programozas/teszt.html#LETOLTES
A kód a fenti URL-t jónak minősítette, bár nincsen benne domain tartományi név (.hu)!
Az URL objektum a beépített metódusokon keresztül természetesen ennél jóval többre képes. Amint az URL valós reprezentációja egy, az Interneten elérhető erőforrásnak, tulajdonképpen a Javában is egyfajta hálózati kiindulópont, hiszen például az openConnection() metódusával önálló hálózati csatlakozást képes kezdeményezni. Ezt a következő fejezetben nézzük meg.