Lekce 3 - Síť v Javě - Práce s URL
V minulé lekci, Síť v Javě - Balíky pro síťovou komunikaci, jsme si ukázali základní balíky Javy pro síťovou komunikaci a popsali jejich základní třídy včetně metod.
V dnešním Java tutoriálu věnovaném práci se
sítí se budeme podrobněji zabývat balíčkem java.net
,
speciálně jeho třídou URL
. Ukážeme si praktické příklady
práce s URL adresou a popíšeme si hlavní metody, které
třída URL
nabízí.
Práce s URL
Balík java.net
obsahuje třídu URL
. Tato třída
reprezentuje URL adresu (Uniform Resource Locator) nějakého
prostředku ve World Wide Web. Každá URL se skládá ze čtyř
částí, přičemž pouze dvě první jsou povinné, ostatní
se dosazují implicitně:
- Identifikátor protokolu – např. FTP, HTTP.
- Název serveru nebo IP adresa - např.:
https://www.itnetwork.cz
. - Číslo portu - to je již volitelný atribut, standardní číslo HTTP
serveru je
80
. - Název souboru nebo název adresáře - opět se jedná o volitelný
atribut, standardně je uveden
index.html
.
Vytvoření URL
Třída URL
poskytuje několik možností vytvoření URL
adresy. Nejjednodušší cesta, jak vytvořit URL objektu, je použít
String
reprezentující pro člověka srozumitelnou formu URL
adresy. V Java programu tedy vytvoříme takový objekt následovně:
URL zakladniAdresa = new URL("https://www.itnetwork.cz");
Právě jsme vytvořili absolutní URL adresu. Ta obsahuje
všechny informace potřebné k dosažení daného zdroje. URL
objekty lze však vytvořit i pomocí relativní adresy s
použitím konstruktoru, který přijímá jiný URL objekt (základ) a
relativní specifikaci URL (String
).
Relativní adresa je platná pouze v kontextu základní adresy URL.
Podívejme se na další příklad:
URL url = new URL(zakladniAdresa, "java-networking-uvod");
První argument určuje základ nového URL. Druhý argument určuje zbytek
názvu zdroje vzhledem k základu. Pokud je základ null
, zachází
konstruktor s relativní URL jako s absolutní URL.
Uveďme si i další možnosti, jak vytvořit URL objekt:
URL(String protokol, String host, String soubor)
- Vytvoří objekt URL ze zadaného protokolu, hostitele a názvu souboru.URL(String protokol, String host, int port, String soubor)
- Vytvoří objekt URL z protokolu, hostitele, čísla portu a názvu souboru.URL(String protokol, String host, int port, String soubor, URLStreamHandler handler)
- Vytvoří objekt URL ze zadaného protokolu, hostitele, čísla portu, názvu souboru a obslužné rutiny, která je typuURLStreamHandler
.URL(URL zakladniAdresa, String relativniAdresa, URLStreamHandler handler)
- Vytvoří objekt URL analýzou dané specifikace se zadanou obslužnou rutinou v rámci základu.
První dva způsoby se používají tehdy, když nemáme řetězec obsahující úplnou specifikaci URL adresy, ale pouze její část.
Všechny tvary konstruktorů mohou při chybném zadání některého
parametru vyvolat výjimku MalformedURLException
, proto je nutné
vytvářet objekty URL v try-catch
bloku.
Vložme tedy kód do hlavní metody main()
, obalme ho blokem
try-catch
, doplňme potřebné balíčky, přidejme metody pro
výpis a spusťme:
import java.net.MalformedURLException; import java.net.URL; public class Main { public static void main(String[] args) { try { // vytvoření absolutní URL adresy URL zakladniAdresa = new URL("https://www.itnetwork.cz"); // vytvoření relativní URL adresy URL relativniAdresa = new URL(zakladniAdresa, "java-networking-uvod"); // tisk řetězcové reprezentace URL adresy System.out.println("Reprezentace URL adresy (absolutni): " + zakladniAdresa.toString()); System.out.println("Reprezentace URL adresy (relativní): " + relativniAdresa.toString()); } catch (MalformedURLException e) { System.out.println(e); } } }
Výsledkem bude vytvoření objektu třídy URL
a tento výpis
(s funkčními odkazy):
Konzolová aplikace
Reprezentace URL adresy (absolutni): https://www.itnetwork.cz
Reprezentace URL adresy (relativní): https://www.itnetwork.cz/java-networking-uvod
Vytvořením objektu třídy URL
jsme vyrobili pouze
lokální objekt, pro navázání spojení musíme tento objekt
spojit s URL a použít metodu openConnection()
. Tato metoda
vytvoří objekt třídy URLConnection
, inicializuje ho a připojí
se na toto URL po síti. Jestliže se některá část připojení nepovede,
metoda openConnection()
vyvolá výjimku
IOException
.
Důležité metody třídy
URL
Pojďme si představit a krátce popsat základní metody, které třída
URL
pro práci na síti nabízí:
Hlavní metody | Popis |
---|---|
public String getProtocol() | Vrátí protokol adresy URL. |
public String getHost() | Vrátí název hostitele adresy URL. |
public int getPort() | Vrátí číslo portu adresy URL. |
public String getFile() | Vrátí název souboru adresy URL. |
public String getAuthority() | Vrátí autoritu adresy URL. |
public String toString() | Vrátí řetězcovou reprezentaci adresy URL. |
public String getQuery() | Vrátí řetězec dotazu adresy URL. |
public int getDefaultPort() | Vrátí výchozí port adresy URL. |
public URLConnection openConnection() | Vrátí instanci URLConnection , tj. přidruženou k této
URL. |
public boolean equals(Object obj) | Porovnává URL s daným objektem. |
public Object getContent() | Vráti obsah adresy URL. |
public String getRef() | Vráti kotvu nebo odkaz adresy URL. |
public URI toURI() | Vráti URI adresy URL. |
Abychom nezůstali u teorie, ukážeme si další příklady.
Komponenty URL
Jak již bylo zmíněno adresa URL se skládá z několika komponent. Ty lze získat pomocí výše popsaných metod. Pojďme si to zkusit. Upravíme náš kód do následující podoby:
// komponenty URL try { // vytvoření absolutní URL adresy URL zakladniAdresa = new URL("https://www.itnetwork.cz"); // vytvoření relativní adresy URL URL relativniAdresa = new URL(zakladniAdresa, "java-networking-uvod"); // tisk řetězcové reprezentace URL adresy System.out.println("Reprezentace URL adresy (relativní): " + relativniAdresa.toString()); System.out.println(); // komponenty URL System.out.println("Protokol: " + relativniAdresa.getProtocol()); System.out.println("Název hostitele: " + relativniAdresa.getHost()); System.out.println("Číslo portu: " + relativniAdresa.getPort()); System.out.println("Název souboru: " + relativniAdresa.getFile()); } catch (MalformedURLException e) { System.out.println(e); }
Kód spustíme:
Konzolová aplikace
Reprezentace URL adresy (relativní): https://www.itnetwork.cz/java-networking-uvod
Protokol: https
Název hostitele: www.itnetwork.cz
Číslo portu: -1
Název souboru: /java-networking-uvod
Jak jsme si už výše uvedli, číslo portu je volitelný atribut. Pokud
tedy číslo portu není uvedeno v URL, metoda getPort()
vrátí
-1
.
Zkusme si ještě vytvořit jiný objekt URL a znovu vypsat komponenty. Předchozí příklad nyní doplníme následujícím kódem:
System.out.println(); URL url = new URL("https://www.google.com/search?q=itnetwork&oq=itnetwork&aqs=chrome..69i57j0i512l4j0i10i512j0i512l4.6501j0j15&sourceid=chrome&ie=UTF-8"); // tisk řetězcové reprezentace URL adresy System.out.println("Reprezentace URL adresy: " + url.toString()); // komponenty URL System.out.println("Protokol: " + url.getProtocol()); System.out.println("Název hostitele: " + url.getHost()); System.out.println("Číslo portu: " + url.getPort()); System.out.println("Výchozí číslo portu: " + url.getDefaultPort()); System.out.println("Řetězec dotazu: " + url.getQuery()); System.out.println("Cesta: " + url.getPath()); System.out.println("Soubor: " + url.getFile());
Podívejme se na výsledek:
Konzolová aplikace
Reprezentace URL adresy (relativní): https://www.itnetwork.cz/java-networking-uvod
Protokol: https
Název hostitele: www.itnetwork.cz
Číslo portu: -1
Název souboru: /java-networking-uvod
Reprezentace URL adresy: https://www.google.com/search?q=itnetwork&oq=itnetwork&aqs=chrome..69i57j0i512l4j0i10i512j0i512l4.6501j0j15&sourceid=chrome&ie=UTF-8
Protokol: https
Název hostitele: www.google.com
Číslo portu: -1
Výchozí číslo portu: 443
Řetězec dotazu: q=itnetwork&oq=itnetwork&aqs=chrome..69i57j0i512l4j0i10i512j0i512l4.6501j0j15&sourceid=chrome&ie=UTF-8
Cesta: /search
Soubor: /search?q=itnetwork&oq=itnetwork&aqs=chrome..69i57j0i512l4j0i10i512j0i512l4.6501j0j15&sourceid=chrome&ie=UTF-8
Čtení přímo z URL
Po úspěšném vytvoření objektu třídy URL
z něho můžeme
číst data. K tomu slouží metoda openStream()
, která vrací
standardní stream pro čtení java.io.InputStream
, proto můžeme
použít její metody (např. read()
).
Metoda openStream()
je jenom zkrácené volání
openConnection().getInputStream()
a může vyvolat výjimku
IOException
Následující úprava našeho programu ukazuje, jak jednoduché je čtení z URL:
try { // vytvoření absolutní URL adresy URL zakladniAdresa = new URL("https://www.itnetwork.cz"); // vytvoření relativní URL adresy URL relativniAdresa = new URL(zakladniAdresa, "java-networking-uvod"); DataInputStream stream = new DataInputStream(relativniAdresa.openStream()); int i; while((i = stream.read()) != -1) { System.out.print((char) i); } } catch (MalformedURLException e) { System.out.println("MalformedURLException: " + e); } catch ( IOException ioe ) { System.out.println("IOException: " + ioe); }
Je třeba naimportovat i tyto balíčky:
import java.io.DataInputStream; import java.io.IOException;
Poslední ukázka otevře vstupní stream a zobrazí jeho obsah na displeji. Po spuštění uvidíme zdrojový soubor html dokumentu na zadané adrese. Pokračovat budeme příště.
V následujícím kvízu, Kvíz - Balíky pro práci se sítí a třída URL v Javě, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.