====== Δουλεύοντας με URLs ====== Τα [[wp>Uniform_resource_locator|URL]]s (Uniform Resource Locators), είναι διαδικτυακές διευθύνσεις οι οποίες προϋποθέτουν την ύπαρξη ενός διαδικτυακού πρωτοκόλλου στο επίπεδο της εφαρμογής (π.χ http, ftp) το οποίο υλοποιείται πάνω από την [[http://en.wikipedia.org/wiki/Internet_protocol_suite|TCP/IP στοίβα]]. Κάθε URL έχει τα εξής χαρακτηριστικά. * **πρωτόκολλο:** το είδος το πρωτοκόλλου που θα χρησιμοποιηθεί (π.χ. http, ftp κλπ) * **host name:** η IP διεύθυνση ή το Domain Name στο οποίο θα γίνει η σύνδεση. * **port:** η πόρτα στην οποία θα γίνει η σύνδεση. * **pathname:** το τμήμα του URL μετά το hostname και πριν τις παραμέτρους * **parameters:** οι παράμετροι του URL. * **ref:** (html specific) Μία αναφορά σε ένα συγκεκριμένο σημείο μέσα στο αρχείο html, η οποία παραπέμπει σε μία συγκεκριμένη θέση μέσα στο αρχείο. Με βάση τα παραπάνω το παρακάτω URL αναλύεται ως εξής http://inf-server.inf.uth.gr:8888/courses/CE325/doku.php?id=java:urls&priority=max#writting_to_urls * πρωτόκόλλο --> 'http' * hostname --> 'inf-server.inf.uth.gr' * port number --> '8888' * pathname --> '/courses/CE325/doku.php' * parameters --> 'id=java:urls&priority=max' * reference --> 'writting_to_urls' ===== Δημιουργώντας ένα URL ===== Μπορείτε να δημιουργήσετε ένα αντικείμενο του τύπου URL με τους παρακάτω τρόπους * με χρήση της απόλυτης διεύθυνσης URL myURL = new URL("http://example.com/pages/"); * με χρήση ενός //base URL// και μία σχετική διεύθυνση σε σχέση με αυτό όπως παρακάτω (θεωρήστε ως myURL, το URL που ορίστηκε παραπάνω): URL page1URL = new URL(myURL, "page1.html"); URL page2URL = new URL(myURL, "page2.html"); * με χρήση των επιμέρους στοιχείων του URL, όπως παρακάτω URL yourURL = new URL("http", "example.com", 80, "pages/page1.html"); Όλοι οι κατασκευαστές της κλάσης URL μπορούν να δημιουργήσουν ένα [[http://docs.oracle.com/javase/7/docs/api/java/net/MalformedURLException.html|MalformedURLException]] εάν το πρωτόκολλο που εισάγεται δεν είανι σωστό ή ένα από τα ορίσματα έχει τιμή NULL. Θα πρέπει να διαχειριστείτε το συγκεκριμένο Exception μέσε ένα try/catch block. ===== Αναλύοντας ένα URL με βάση το API της κλάσης ===== import java.net.*; import java.io.*; public class DecomposeURL { public static void main(String[] args) throws Exception { URL aURL = new URL("http://example.com:80/docs/books/tutorial" + "/index.html?name=john&sirname=smith#flushing"); System.out.println("protocol = " + aURL.getProtocol()); System.out.println("authority = " + aURL.getAuthority()); System.out.println("host = " + aURL.getHost()); System.out.println("port = " + aURL.getPort()); System.out.println("path = " + aURL.getPath()); System.out.println("query = " + aURL.getQuery()); System.out.println("filename = " + aURL.getFile()); System.out.println("ref = " + aURL.getRef()); } } Το αποτέλεσμα εκτέλεσης του παραπάνω κώδικα είναι το εξής protocol = http authority = example.com:80 host = example.com port = 80 path = /docs/books/tutorial/index.html query = name=john&sirname=smith filename = /docs/books/tutorial/index.html?name=john&sirname=smith ref = flushing ===== Χρησιμοποιώντας την κλάση URL για να ανοίξουμε ένα απομακρυσμένο resource ===== import java.net.*; import java.io.*; public class URLReader { public static void main(String[] args) { URL url=null; try { url = new URL(args.length>0 ? args[0] : "http://feeds.bbci.co.uk/news/rss.xml"); BufferedReader in = new BufferedReader( new InputStreamReader(url.openStream()) ); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); } in.close(); } catch(MalformedURLException ex) { System.out.println("Malformed URL: +"+ args[0] ); ex.printStackTrace(); } catch(IOException ex) { System.out.println("Error while reading or writing from URL: "+url.toString() ); } } } To παραπάνω θα μπορούσε να γραφεί ισοδύναμα ως εξής με χρήση ενός αντικειμένου [[http://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html|URLConnection]]. import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(String[] args) { URL url=null; try { url = new URL(args.length>0 ? args[0] : "http://feeds.bbci.co.uk/news/rss.xml"); URLConnection urlcon = url.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader(urlcon.getInputStream()) ); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); } in.close(); } catch(MalformedURLException ex) { System.out.println("Malformed URL: +"+ args[0] ); ex.printStackTrace(); } catch(IOException ex) { System.out.println("Error while reading or writing from URL: "+url.toString() ); } } }