NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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 typu URLStreamHandler.
  • 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í.


 

Předchozí článek
Síť v Javě - Balíky pro síťovou komunikaci
Všechny články v sekci
Síť v Javě
Přeskočit článek
(nedoporučujeme)
Kvíz - Balíky pro práci se sítí a třída URL v Javě
Článek pro vás napsal Zdeněk Dvorský
Avatar
Uživatelské hodnocení:
14 hlasů
Autor se věnuje programováni zatím jen pro zábavu, ale rád by to změnil na profesionální dráhu.
Aktivity