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úborujarna 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í hodnotuifModifiedSincepodľa tohtoURLConnectionna 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ú hodnotuUseCachesztruenafalse.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átinullpokiaľ 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_VALUEzí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átumURLConnectionposlednej ú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.
