Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

3. diel - Sieť v Jave - Práca s URL

V minulej lekcii, Sieť v Jave - Balíky pre sieťovú komunikáciu , sme si ukázali základné balíky Javy pre sieťovú komunikáciu a popísali ich základné triedy vrátane metód.

V dnešnom Java tutoriále venovanom práci so sieťou sa budeme podrobnejšie zaoberať balíčkom java.net a špeciálne jeho triede URL. Ukážeme si praktické príklady práce s URL adresou a popíšeme si hlavné metódy, ktoré java.net.URL ponúka.

Práca s URL

Balík java.net obsahuje triedu URL. Táto trieda reprezentuje adresu (Uniform Resource Locator) nejakého prostriedku vo World Wide Web. Každá URL sa skladá zo štyroch častí, pričom iba dve prvé sú povinné, ostatné sa dosadzujú implicitne:
  • Identifikátor protokolu – ftp, http...
  • Názov servera alebo IP adresa - napr.: https://www.itnetwork.cz/
  • Číslo portu - číslo portu je už voliteľný atribút, štandardné číslo http servera je 80
  • Názov súboru alebo názov adresára - opäť sa jedná o voliteľný atribút, štandardne je uvedený index.html

Vytvorenie URL

Trieda URL poskytuje niekoľko možností vytvorenia URL. Najjednoduchšia cesta, ako vytvoriť URL objektu, je použiť String reprezentujúci pre človeka zrozumiteľnú formu URL adresy. V Java programe teda vytvoríme takýto objekt nasledovne:
URL zakladniAdresa = new URL("https://www.itnetwork.cz");

Práve sme vytvorili absolútnu adresu URL. Absolútna adresa URL obsahuje všetky informácie potrebné na dosiahnutie daného zdroja. URL objekty je možné vytvoriť aj za pomoci relatívnej adresy s použitím URL konštruktora, ktorý prijíma iný URL objekt (základ) a relatívnu špecifikáciu URL (String). Relatívna adresa je platná iba v kontexte základnej adresy URL.

Pozrime sa na ďalší príklad:

URL url = new URL(zakladniAdresa, "java-networking-uvod");

Prvý argument určuje základ nového URL. Druhý argument určuje zvyšok názvu zdroja vzhľadom na základ. Pokiaľ je základ null, zaobchádza konštruktor s relatívnou URL ako s absolútnou špecifikáciou URL a základná URL sa ignoruje.

Uveďme si aj ďalšie možnosti, ako vytvoriť URL objekt:

  • URL(String protokol, String host, String soubor) - Vytvorí objekt URL zo zadaného protokolu, hostiteľa a názvu súboru.
  • URL(String protokol, String host, int port, String soubor) - Vytvorí objekt URL z protokolu, hostiteľa, čísla portu a názvu súboru.
  • URL(String protokol, String host, int port, String soubor, URLStreamHandler handler) - Vytvorí objekt URL zo zadaného protokolu, hostiteľa, čísla portu, názvu súboru a obslužnej rutiny, ktorá je typu URLStreamHandler.
  • URL(URL zakladniAdresa, String relativniAdresa, URLStreamHandler handler) - Vytvorí objekt URL analýzou danej špecifikácie so zadanou obslužnou rutinou v rámci základu.

Prvé dva spôsoby sa používajú vtedy, keď nemáme reťazec obsahujúci úplnú špecifikáciu adresy URL, ale iba časti tejto adresy.

Všetky tvary konštruktorov môžu pri chybnom zadaní niektorého parametra vyvolať výnimku MalformedURLException, preto je nutné vytvárať objekty URL v try-catch bloku. Vložme teda kód do hlavnej metódy main(), obaľme ho blokom try-catch, doplňme potrebné balíčky, pridajme metódy pre výpis a spustime:

import java.net.MalformedURLException;
import java.net.URL;

public class Main {

    public static void main(String[] args) {
        try {
            // vytvoření absolutní adresy URL
            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 adresy URL
            System.out.println("Reprezentace adresy URL (absolutni): " + zakladniAdresa.toString());
            System.out.println("Reprezentace adresy URL (relativní): " + relativniAdresa.toString());

        } catch (MalformedURLException e) {
            System.out.println(e);
        }
    }
}

Výsledkom bude vytvorenie objektu triedy URL a tento výpis (s funkčnými odkazmi):

Konzolová aplikácia
Reprezentace adresy URL (absolutni): https://www.itnetwork.cz
Reprezentace adresy URL (relativní): https://www.itnetwork.cz/java-networking-uvod

Vytvorením objektu triedy URL sme vyrobili iba lokálny objekt, pre nadviazanie spojenia musíme tento objekt spojiť s URL a použiť metódu openConnection(). Táto metóda vytvorí objekt triedy URLConnection, inicializuje ho a pripojí sa na toto URL po sieti. Ak sa niektorá časť pripojenia nepodarí, metóda openConnection() vyvolá výnimku IOException.

Dôležité metódy triedy URL

Poďme si predstaviť a krátko popísať základné metódy, ktoré trieda URL pre prácu na sieti ponúka:
Hlavné metódy Popis
public String getProtocol() Vráti protokol adresy URL.
public String getHost() Vráti názov hostiteľa adresy URL.
public int getPort() Vráti číslo portu adresy URL.
public String getFile() Vráti názov súboru adresy URL.
public String getAuthority() Vráti autoritu adresy URL.
public String toString() Vráti reťazcovú reprezentáciu adresy URL.
public String getQuery() Vráti reťazec dotazu adresy URL.
public int getDefaultPort() Vráti predvolený port adresy URL.
public URLConnection openConnection() Vráti inštanciu URLConnection, tj pridruženú k tejto URL.
public boolean equals(Object obj) Porovnáva URL s daným objektom.
public Object getContent() Vráti obsah adresy URL.
public String getRef() Vráti kotvu alebo odkaz adresy URL.
public URI toURI() Vráti URI adresy URL.
Aby sme nezostali pri teórii, ukážeme si ďalšie príklady.

Komponenty URL

Ako už bolo spomenuté adresa URL sa skladá z niekoľkých komponentov. Tie je možné získať pomocou vyššie popísaných metód. Poďme si to skúsiť. Upravíme náš kód do nasledujúcej podoby:
// komponenty URL
        try {
            // vytvoření absolutní adresy URL
            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 adresy URL
            System.out.println("Reprezentace adresy URL (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á aplikácia
Reprezentace adresy URL (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

Ako sme si už vyššie uviedli, číslo portu je voliteľný atribút. Ak teda číslo portu nie je uvedené v URL, metóda getPort() vráti -1.

Skúsme si ešte vytvoriť iný objekt URL a znova vypísať komponenty:

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 adresy URL
System.out.println("Reprezentace adresy URL: " + 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());

Pozrime sa na výsledok:

Konzolová aplikácia
Reprezentace adresy URL (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 adresy URL: 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

Čítanie priamo z URL

Po úspešnom vytvorení objektu triedy URL z neho môžeme čítať dáta. Na to slúži metóda openStream(), ktorá vracia štandardný stream na čítanie java.io.InputStream, preto môžeme použiť jej metódy (napr. read()).

Metóda openStream() je iba skrátené volanie openConnection().getInputStream() a môže vyvolať výnimku IOException

Nasledujúca úprava nášho programu ukazuje, aké jednoduché je čítanie z URL:

    try {
            // vytvoření absolutní adresy URL
            URL zakladniAdresa = new URL("https://www.itnetwork.cz");
            // vytvoření relativní adresy URL
            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 potrebné naimportovať aj tieto balíčky:

import java.io.DataInputStream;
import java.io.IOException;

Posledná ukážka otvorí vstupný stream a zobrazí jeho obsah na displeji. Po spustení uvidíme zdrojový súbor html dokumentu na zadanej adrese. Pokračovať budeme nabudúce.

V budúcej lekcii, Sieť v Jave - Práca s URLConnection , sa zoznámime s triedou java.net.URLCon­nection, uvedieme si niektoré jej metódy a ukážeme si aj praktické príklady ich použitia.


 

Predchádzajúci článok
Sieť v Jave - Balíky pre sieťovú komunikáciu
Všetky články v sekcii
Sieť v Jave
Preskočiť článok
(neodporúčame)
Sieť v Jave - Práca s URLConnection
Článok pre vás napísal Zdeněk Dvorský
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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