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úborujar
na webe, použijeme podtrieduJarURLConnection
.
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 natrue
, resp.false
).setDoInput(boolean)
- Ak sa má použiť pripojenie URL pre vstup, potom bude hodnota nastavená natrue
(predvolené).setDoOutput(boolean)
- Môžeme tiež určiť, či sa má použiť pripojenie URL pre výstup. Tu je predvolená hodnotafalse
.setIfModifiedSince(long)
- Nastaví hodnotuifModifiedSince
podľa tohtoURLConnection
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ú hodnotuUseCaches
ztrue
nafalse
.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ú.
getContent()
- Načíta obsah pripojenia URL.getHeaderField(int)
- Vráti hodnotu poľa n-teho záhlavia. Vrátinull
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ípadnenull
, 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 akoInteger.MAX_VALUE
získame hodnotu-1
.getContentType()
- Vráti typ obsahu zdroja, na ktorý adresa URL odkazuje alebonull
, pokiaľ nie je známy.getDate()
- Získame dátum odoslania zdroja, na ktorý adresa URL odkazuje alebo0
, 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ípadne0
.getLastModified()
- Vráti dátumURLConnection
poslednej úpravy zdroja, na ktorý sa odkazuje, pokiaľ nie je známe bude hodnota opäť0
.
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.HttpURLConnection vrátane metód a ukážeme si, ako ju použiť v praxi v spojení s HTTP požiadavkou GET.