IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

4. diel - Sieť v Jave - Práca s URLConnection

V minulej lekcii, Sieť v Jave - Práca s URL , sme si popísali triedu java.net.URL vrátane ich základných metód a ukázali si, ako ich použiť v praxi.

Trieda URLConnection

Trieda URLConnection je abstraktná trieda, ktorej podtriedy tvoria spojenie medzi používateľskou aplikáciou a akýmkoľvek zdrojom na webe. Triedu môžeme použiť na čítanie z akéhokoľvek zdroja, na ktorý odkazuje objekt URL a tiež na zápis do neho. Existujú hlavne dve podtriedy, ktoré rozširujú triedu URLConnection.

  • HttpURLConnection - Ak sa pripájame k akejkoľvek URL, ktorá používa „http“ ako svoj protokol, použije sa táto podtrieda.
  • JarURLConnection - Ak sa však pokúšame nadviazať pripojenie k súboru jar na webe, použijeme podtriedu JarURLConnection.
Trieda URLConnection nám umožňuje získať informácie zo servera, spracovať ich a výsledky buď odoslať späť na server, alebo iba zobraziť požadovanú informáciu. Predstavte si napríklad aplikáciu, ktorá od užívateľa požaduje názov filmu a na oplátku vracia hodnotenie filmu alebo všetky odkazy súvisiace s ním.

Akonáhle je teda nadviazané spojenie (vytvorený objekt triedy URL) a program Java má objekt URLConnection, potom ho možno použiť na čítanie alebo zápis alebo či získavanie ďalších informácií napr. dĺžky obsahu a podobne.

Metódy triedy URLConnection

Než sa pustíme do príkladov, predstavme si základné metódy, ktoré máme k dispozícii.

Metódy slúžiace na úpravu parametrov požiadavky:

  • setAllowUserInteraction(boolean) - Umožňuje povoliť či zakázať užívateľské interakcie (parameter nastavíme na true, resp. false).
  • setDoInput(boolean) - Ak sa má použiť pripojenie URL pre vstup, potom bude hodnota nastavená na true (predvolené).
  • setDoOutput(boolean) - Môžeme tiež určiť, či sa má použiť pripojenie URL pre výstup. Tu je predvolená hodnota false.
  • setIfModifiedSince(long) - Nastaví hodnotu ifModifiedSince podľa tohto URLConnection na zadanú hodnotu.
  • setUseCaches(boolean) - Niektoré protokoly ukladajú dokumenty do medzipamäte. Občas je potrebné vyrovnávaciu pamäť ignorovať (napr. tlačidlo znovu načítať v prehliadači), v takom prípade zmeníme východiskovú hodnotu UseCaches z true na false.
  • setRequestProperty(String, String) - Táto metóda nastavuje vlastnosť všeobecnej požiadavky. Ak vlastnosť s kľúčom už existuje, prepíše pôvodnú hodnotu novú.
Metódy pre prístup k poliam hlavičky a obsahu po vytvorení pripojenia k vzdialenému objektu:
  • getContent() - Načíta obsah pripojenia URL.
  • getHeaderField(int) - Vráti hodnotu poľa n-teho záhlavia. Vráti null pokiaľ je polí menej ako n+1.
  • getInputStream() - Vráti vstupný dátový prúd, ktorý číta z aktuálne otvoreného pripojenia.
  • getOutputStream() - Vráti výstupný prúd, ktorý zapisuje do tohto pripojenia.
  • getContentEncoding() - Vráti hodnotu kódovania obsahu zdroja, na ktorý adresa URL odkazuje, prípadne null, pokiaľ nie je známe.
  • getContentLength() - Vráti dĺžku obsahu zdroja, na ktorý odkazuje adresa URL tohto pripojenia, pokiaľ dĺžka obsahu nie je známa alebo je väčšia ako Integer.MAX_VALUE získame hodnotu -1.
  • getContentType() - Vráti typ obsahu zdroja, na ktorý adresa URL odkazuje alebo null, pokiaľ nie je známy.
  • getDate() - Získame dátum odoslania zdroja, na ktorý adresa URL odkazuje alebo 0, pokiaľ nie je známe. Vrátená hodnota je počet milisekúnd od 1. januára 1970 GMT.
  • getExpiration() - Vráti dátum vypršania platnosti zdroja, na ktorý táto adresa URL odkazuje. Ako predchádzajúca metóda vracia počet milisekúnd od 1. januára 1970 GMT, prípadne 0.
  • getLastModified() - Vráti dátum URLConnection poslednej úpravy zdroja, na ktorý sa odkazuje, pokiaľ nie je známe bude hodnota opäť 0.
Každá z vyššie uvedených set metód má zodpovedajúcu get metódu na načítanie hodnoty parametra alebo vlastnosti všeobecnej požiadavky. Špecifické parametre a všeobecné vlastnosti požiadavky, ktoré sú použiteľné, sú špecifické pre protokol.

Čítanie z URL pomocou URLConnection

Na čítanie z URL pomocou triedy URLConnection je potrebné vykonať nasledujúce kroky:

1. Vytvorenie URL (objekt triedy URL) - viď. článok venovaný práci s URL:

URL url = new URL("https://...");

2. Vytvorenie objektu URLConnection - Zavoláme metódu openConnection(), tá vytvorí objekt URLConnection, inicializuje ho a pripojí sa na toto URL po sieti. Ak sa niečo nepodarí metóda vyvolá výnimku IOException:

URLConnection urlConection = url.openConnection();

3. Zobrazenie informácií (obsahu) do konzoly - Pomocou BufferedReader a InputStream otvoreného pripojenia použitím metódy getInputStream():

BufferedReader br = new BufferedReader(new InputStreamReader(urlConection.getInputStream())); // získání vstupního streamu

// tisk zdrojového souboru řádek po řádku
String s = br.readLine();
while (s != null) {
    System.out.println(s);
    s = br.readLine();
}

4. Uzavretie streamu - Po dokončení nesmieme zabudnúť zavrieť InputStream:

br.close();

Na inštancii BufferedReader jednoducho zavoláme metódu close().

Použitie triedy URLConnection pre zobrazenie zdrojového kódu webovej stránky

Náš program pre zobrazenie webovej stránky bude vyzerať nasledovne:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class URLConectionDemo {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://www.itnetwork.cz/java/sit"); //vytvoří spojení na server
            URLConnection urlConection = url.openConnection();
            System.out.println("Typ obsahu zdroje: " + urlConection.getContentType());
            System.out.println("Kódování obsahu zdroje " + urlConection.getContentEncoding());
            System.out.println("Délku obsahu zdroje " + urlConection.getContentLength());
            System.out.println("Datum odeslání zdroje " + urlConection.getDate());
            System.out.println("Datum vypršení platnosti zdroje " + urlConection.getExpiration());
            System.out.println("Datum URLConnection poslední úpravy zdroje " + urlConection.getLastModified());
            System.out.println();
            int i = 0;
            while (urlConection.getHeaderField(i) != null) {
                System.out.printf("Hodnota pole %s záhlaví %s \n", i, urlConection.getHeaderField(i));
                i++;
            }

            // získání vstupního streamu (vstupní datový proud) - používá se ke čtení vrácených dat
            BufferedReader br = new BufferedReader(new InputStreamReader(urlConection.getInputStream()));

            System.out.println("Úplný zdrojový kód adresy URL je:");
            System.out.println("---------------------------------");

            // tisk zdrojového souboru řádek po řádku
            String s = br.readLine();
            while (s != null) {
                System.out.println(s);
                s = br.readLine();
            }
            br.close();
        } catch(Exception e) {
            System.out.println(e);
        }
    }
}

Ak kód teraz spustíme, vypíše nasledujúce údaje:

Konzolová aplikácia
Typ obsahu zdroje: text/html
Kódování obsahu zdroje null
Délku obsahu zdroje -1
Datum odeslání zdroje 1662301433000
Datum vypršení platnosti zdroje 375007920000
Datum URLConnection poslední úpravy zdroje 0

Hodnota pole 0 záhlaví HTTP/1.1 200 OK
Hodnota pole 1 záhlaví Sun, 04 Sep 2022 14:23:53 GMT
Hodnota pole 2 záhlaví text/html
Hodnota pole 3 záhlaví chunked
Hodnota pole 4 záhlaví keep-alive
Hodnota pole 5 záhlaví Thu, 19 Nov 1981 08:52:00 GMT
Hodnota pole 6 záhlaví no-store, no-cache, must-revalidate
Hodnota pole 7 záhlaví no-cache
Hodnota pole 8 záhlaví PHPSESSID=tplbphmh8sdf80mc3i8a924318; path=/; HttpOnly
Hodnota pole 9 záhlaví DYNAMIC
Hodnota pole 10 záhlaví {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=1scb9G4wzyQJQbiiQZEmI7lePMxUSSmVWekBYrnrKqCpGFqy5OrJDOR2RYFuDh70TYx%2BasKNItyRqTXVzdK0mVfoXhX8WCft9vIEEWBjPiScAI3VWb0xre1RCJWBoElQ16XO"}],"group":"cf-nel","max_age":604800}
Hodnota pole 11 záhlaví {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Hodnota pole 12 záhlaví cloudflare
Hodnota pole 13 záhlaví 745762b3df33b347-PRG
Hodnota  pole 14 záhlaví h3=":443"; ma=86400, h3-29=":443"; ma=86400

Úplný zdrojový kód adresy URL je:
---------------------------------
...zde bude zdrojový kód stránky...

Program robí v podstate to isté čo robil program, ktorý sme si ukázali v článku Sieť v Jave - Práca s URL, ktorý demonštroval čítanie priamo z URL pomocou metódy a openStream(). Avšak čítanie z URL pomocou triedy URLConnection je výhodnejšie, pretože objekt tejto triedy môžeme súčasne použiť v inej úlohe, napríklad na zápis.

Zápis do URL pomocou URLConnection

Veľa HTML dokumentov obsahuje formuláre, tj textové položky a iné GUI objekty, ktorými sa zadávajú dáta pre server. Po zadaní prehliadač odovzdá dáta serveru. Na druhom konci siete špeciálne programy dáta spracujú a pošlú späť odpoveď, väčšinou v tvare HTML dokumentu.

Aby Java program mohol interagovať s procesom na strane servera, musí byť schopný zapisovať na URL, a tak poskytovať dáta serveru. Toho docielime pomocou nasledujúcich krokov:

1. Vytvoríme objekt URL:

URL url = new URL("http//...");

2. Ďalej Vytvoríme objekt URLConnection:

URLConnection conection = url.openConnection();

3. Z otvoreného spojenia tentoraz vezmeme výstupný stream, ktorý je pripojený k štandardnému vstupnému streamu programu na serveri:

PrintStream outStream = new PrintStream(connection.getOutputStream());

4. Zapisovať potom dáta do streamu môžeme štandardnými metódami, napr.

outStream.println();

5. Nakoniec stream opäť zatvoríme:

outStream.close();

Vidíme, že postup je obdobný, ako v prípade čítania dát, ktoré sme si ukázali vyššie.

Ako už bolo spomenuté vyššie, ak sa pripájame k akejkoľvek URL, ktorá používa „http“ ako svoj protokol, využíva sa trieda HttpURLConnection. Túto triedu vrátane príkladov použitia si popíšeme v niektorom z ďalších článkov.

V budúcej lekcii, Sieť v Jave - Práca s HttpURLConnection - Požiadavka GET , si popíšeme triedu java.net.HttpUR­LConnection vrátane metód a ukážeme si, ako ju použiť v praxi v spojení s HTTP požiadavkou GET.


 

Predchádzajúci článok
Sieť v Jave - Práca s URL
Všetky články v sekcii
Sieť v Jave
Preskočiť článok
(neodporúčame)
Sieť v Jave - Práca s HttpURLConnection - Požiadavka GET
Č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